2012-03-28 16 views
1

左と右の引用符を含むUTF-8エンコードされたhtmlテキストを解析しようとしています しかし、saveHTML()でDOMからhtmlの値を取得しようとすると、引用符は常につまずく。DOM xpathが引用符を壊す

私はDOMに入れる前にテキストをutf8_encodingしていくつか試してみましたが、( '1.0'、 'UTF-8')をコンストラクタに入れてみましたが、うまくいきませんでした。

私はこれを整理する方法が不足しています。 引用符をhtmlエンティティに変換することは私の選択肢ではありません。ここで

は引用符を壊す簡単な例です:

$a = "<html><body><div>won’t you, will you, won’t you, join the </div></body></html>"; 
$dom = new DOMDocument(); 

$dom->loadHTML($a); 

$xpath = new DOMXPath($dom); 

$tag = $xpath->query('//div'); 

foreach($tag as $t) 
    echo $dom->saveHTML($t); 

が返されるテキストは、次のようになります。あなたは、wonâtあなたは、あなたが、wonâtあなたは、

+0

文字列がどの文字列であるか知っていますか?私はそれがutf8ではないと賭ける –

+0

それはutf8だ。しかし、私は質問で言ったように。文字列にutf8_encodeを使用してdomに渡すと同じ結果が得られます... –

答えて

1

[OK]を、これを試してみてください。

$a = "<html> 
    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> 
<body><div>won’t you, will you, won’t you, join the </div></body></html>"; 

次にあなたがloadHTMLを使用することができます($ a)と:

はこのように、最初にあなたのhtmlに適切なメタタグを追加それは動作します

最後に、余分なメタタグを追加することはできません。これを試すことができます: $ dom-> loadHTML(utf8_decode($ a));を使用します。 これは、文字列を最初にutf8からlatin-1に変換するので、latin-1文字セットのDOMにロードされ、latin-1として出力されます。

+0

ありがとう! –

1

に参加するだろうソリューションはいるようですloadHTML()の代わりに$ dom-> loadXML($ a)を使用してください。 私はそれを試してみました。あなたがloadHTMLを使う、という場合

+1

なぜなら、loadXMLは常にcharsetが指定されていない限り、loadinfoがデフォルトのcharsetとしてlatin-1を使用するのに対し、utf- HTMLマークアップのメタタグ –

+0

hmm ...もしloadHMTLをloadXMLに変更した場合、xmlエンティティの文字列をこのように戻します: "病気、â € ™あなたは、あなたになりますか" それは私のためにdoens't –