2011-08-28 17 views
4

私は×DOMDOCUMENTとHTMLエンティティ

$str = '<a href="http://example.com/"> A &#215; B</a>'; 

$dom = new DomDocument; 
$dom -> substituteEntities = false; 
$dom ->loadHTML($str); 

$link = $dom ->getElementsByTagName('a') -> item(0); 
$fullname = $link -> nodeValue; 
$href = $link -> getAttribute('href'); 

echo " 
fullname: $fullname \n 
href: $href\n";  

のように、いくつかのHTMLエンティティを含み、いくつかのHTMLを解析しようとしているが、DOMDOCUMENTがA- B.

用のテキストはいくつかの方法があります置き換えますそれがHTMLエンティティのために&を取っておかないようにして、ただそれをそのままにしておきますか? substituteEntitiesをfalseに設定しようとしましたが、何もしません。

+0

なぜあなたはそれらを保持したいですか? – Gordon

+0

私はほんの少しだけ並べ替えたいですが、私が実際にやりたいことは、それらをxで置き換えることです。それは、私が更新しているスクレーパーからの古いコードと同じフォーマットのテキストを入れてしまうためです。どのように私は正規表現でそれらのシンボルを含めて行くだろう考え – rafa

答えて

1

&amp;に置き換えられますか?そうであれば、正確なエンティティがテキストとして表示されますが、あなたが得ている文字化けした応答ではありません。

私の推測では、実際の文字に変換され、この文字が含まれていないlatin1文字セットでページが表示されているため、文字化けしたレスポンスが表示されます。私はあなたの例をレンダリングする場合

、私の出力は次のようになります。

fullname: A × B 

href: http://example.com/ 

latin1の/ ISO-8859-1でこれを見て、私はあなたが記述している出力を参照してください。しかし、私が文字セットをUTF-8に設定すると、出力は正常です。

+0

私はコードからその応答をコピーしていたので、それは奇妙です。とにかく、私はutf8_encodeとdecodeを使用して、それはトリックでした。ありがとう – rafa

+0

ブラウザでレスポンスを表示している場合、自動的に文字セットを判別しようとします。したがって、実際の出力を表示する場合は、ページソースを表示する方がよいでしょう。 –

+0

ええ、私はクロームでページソースを見ていたことを意味していました。貼り付けたものがどこにあるのですか? – rafa

3

これは質問には直接的な回答ではありませんが、UTF-8を代わりに使用することができます。これにより、÷またはxのようなグリフを直接保存できます。他のニーズにPHP DOMでUTF-8を使用するにはa little hack

また、数式(A×B示唆)を表示しようとすると、MathMLがあります。

+0

おかげで、彼らは方程式ではありません。 – rafa

+0

ハックありがとう、それでもHTMLのもので置き換えられます...)。今は2013年ですが、UTF-8を適切に処理するためにはまだトリックを使用する必要があります:-( – Damien

4
ドキュメントから

DOM拡張は、UTF-8エンコーディングを使用しています。
utf8_encode()およびutf8_decode()を使用して、ISO-8859-1エンコーディングまたはIconvのテキストを他のエンコーディングに使用できます。あなたはLatin-1の試み使用していると仮定すると、

:私は同じ問題に直面しています

<?php 
header('Content-type:text/html;charset=iso-8859-1'); 


$str = utf8_encode('<a href="http://example.com/"> A &#215; B</a>'); 

$dom = new DOMDocument; 


$dom -> substituteEntities = false; 
$dom ->loadHTML($str); 

$link = $dom ->getElementsByTagName('a') -> item(0); 
$fullname = utf8_decode($link -> nodeValue); 
$href = $link -> getAttribute('href'); 

echo " 
fullname: $fullname \n 
href: $href\n"; ?> 
+0

utf8_encodeとデコードのwokedを使用していただきありがとうございますが、残りのすべてについてお読みになります – rafa

+0

Btw、逆の順序で - 私の最初のデータは既にエンコードされているので、うまくいきました。ありがとう! –

0

は、実際には、はutf8_encodeとdeccodeには、例えば、それらのすべていくつかのケースのためにトリックを行うなく&#x03A3; utf-8デコード関数を使ってレンダリングすることはできません。私たちが必要とする基本的な考え方は、htmlエンティティを文字列の中に保持することです。

+2

答えはコメントでなければなりません。 – Oz123

関連する問題