htmlから文字列として渡されるテキストを抽出しています。抽出されるテキストの形式は奇妙です。それはアラビア語でなければならないが、抽出時に奇妙な文字を表示している。私は理解しやすいようにコードにコメントしました。全体的に、コードはhtmlの文字セットを見つけるために何をしますか? (utf、windows-1256)、適切な方法で文書をロードします。 htmlノード解析を使用して、必要なhtml要素をループ内で検索し、それぞれの必要なテキストを抽出します。htmlからテキストを抽出する際の奇妙な文字
問題がif文の中の二つの文である
$html = @iconv('windows-1256', 'windows-1256', $html);
@$doc->loadHTMl($this->metaUtf8. $html);
を動作し、コメントアウトされた後の次の文は、そうすべきではないと上記の2文なしで動作するはずちんぷんかんぷんテキストを示しています。だから何が原因だろうか?
//@$doc->loadHTMl($this->metaWindows1256. $html);
コード:私はコードの他の部分では、UTFにwindows1256からHTMLに変換したが判明
//strings declared that will appended to html when loading the doc
public $metaWindows1256 = '<meta http-equiv="Content-Type" content="text/html; charset=windows-1256"/>' ;
public $metaUtf8 = '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>' ;
//extract characterset of html passed in variable $html
preg_match('@<meta\s+http-equiv="Content-Type"\s+content="([\w/]+)(;\s+charset=([^\s"]+))[email protected]', $html, $matches);
if (isset($matches[3]))
{
$charset = $matches[3];
}
$doc = new DOMDocument();
if(!($charset=='UTF-8') && !($charset=='utf-8'))
{
$html = @iconv('windows-1256', 'windows-1256', $html);
@$doc->loadHTMl($this->metaUtf8. $html);
//@$doc->loadHTMl($this->metaWindows1256. $html);
}
else
{
echo 'LOADING UTF';
@$doc->loadHTMl($this->metaUtf8. $html);
}
foreach($doc->getElementsByTagName($element_tagname) as $element)
{
if (substr_count($element->getAttribute($attribute),$value)!=0) //if the title of the div contains 'post_message'
{
$found_element[]= $element->getAttribute('href');
$found_element[]= $element->nodeValue;
$found_elements[] = $found_element;
unset($found_element);
}
}`
@演算子の使用を避けてください。それはパフォーマンスにかなりの影響を与える可能性があり、コードをデバッグするときに必要となるよりもはるかに難しくなります。 error_reporting、display_errors、およびlog_errorsのPHP設定またはini_set呼び出しを使用してエラーメッセージ出力を構成する方がずっと優れています。 – GordonM
なぜ2つの同じエンコーディングで 'iconv'を使用しますか? –
@Marek Sebera:それは不思議なことに、それがなければ動作しません。それらの奇妙な文字を入手してください –