2011-07-07 5 views
2

domドキュメントgetElementsByTagNameを使用してウェブサイトのタイトルを取得します。ここphp domドキュメント特殊文字を削除する

は私のコードです:

$doc = new DOMDocument(); 
@$doc->loadHTML($strData); 
$doc->encoding = 'utf-8'; 
$doc->saveHTML(); 
$titleNode = $doc->getElementsByTagName("title"); 

それが正常に動作しますが、タイトルに特殊文字がある場合には、取得したデータは正確ではありません。代わりに "Some More Google Plus Invite Workarounds #wrapper { background:url(/) no-repeat 50% 0; } body { background:#CFD8E2; }"を取得しています。

私は特殊文字を置き換えるために次のことをやったが、それは仕事didntの:

// Replace all special characters into space 
    $specialChars = array('~','`','!','@','#','$','%','^','&','*','(',')','-','_','=','+','|','\\',']','[','}','{','"','\'',':',';','/','?','.',',','>','<'); 
     foreach ($specialChars as $a) { 
     $titleNode = str_replace($a, ' ', $titleNode); 

    } 

イムは、代わりに空のタイトルを取得します。 <title>値は、このように気にいらないですので、私は

+0

ええと、htmlタグの先頭に「より小さい」(<)がありますか? –

+0

それは..それを読んだ後に、それはCSSスタイルを読むために飛びます。 – nuttynibbles

+1

+1パーサーを使用しています! –

答えて

1

あなたのHTMLが整形式ではないようです。タイトルに浮かれた<がある場合、私はあなたがWarning: DOMDocument::loadHTML(): error parsing attribute name in Entity, line: 1 in <path> on line <line>を得ていないことに驚いています。交換に関しては

:あなたは、HTML文書に<>のすべてを交換する場合、あなたはそれから要素を取得することができないでしょう。そこではありません任意の要素は左:

<head><title>Foo</title></head> 

になります

headtitleFoo/title/head 

残念ながら、これを修正するためにあまり多くのことを行うことはできません。悪いHTMLは悪いHTMLです。事前にそのタイプの問題を予測できることがわかっている場合は、preg_replace(おそらくpreg_replace("#\s<\s#g",'&lt;',$input);preg_match('#title[^>]*>(.*)</title#', $input, $matches)?)またはsubstrを使用して何かを行うことができますが、ちょうどクリークの上にいるかもしれません。

+0

htmlページが正しくクロールされていません。私がしたのは、タイトル値の< >を置き換えることだけでした。だから、それは残りのhtml = Dには影響しない – nuttynibbles

0

私が持っていたサイトを見て何を

<title>Some More Google Plus Invite Workarounds < Communication, Social Networking < PC World India News < PC World.in</title> 

やるべき

。そして、彼らはタイトルに適切なHTML-エンティティを使用していないので、それは問題だ:

<title>Some More Google Plus Invite Workarounds < Communication, Social Networking < PC World India News < PC World.in</title> 

私はのDOMDocumentはそれで問題があり、タグが終わるところ、これがあると考えていることを前提としています。この問題を回避するには、回避策として$ specialCharsに '<'を追加します。

+0

が追加されました!現在str_replaceを使用しているため、ページがクラッシュすることはありません。そうでないと、私のウェブサイトは、タイトルを表示する瞬間がクラッシュする – nuttynibbles

0
$fp = fsockopen("www.domain.com", 80, $errno, $errstr, 30); 
if (!$fp) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    $out = "GET/HTTP/1.1\r\n";  
    $out .= "Host: www.domain.com\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    $buffer = ''; 
    while (!feof($fp)) { 
     $buffer .= fgets($fp, 128); 
    } 
    fclose($fp); 
      preg_match('#<.*?title.*?>(.*?)<.*?title.*?>#', $buffer, $matches); 
      var_dump($matches); 
} 
+0

正規表現に一致する必要はありません '

Something
Something else
' – cwallenpoole

+0

私は解決策を試してみましょうと後であなたに聞いてみましょう= D – nuttynibbles

+0

@cwallenpoole私はあなたが正しいと思います。言及されたような偽陽性を避けるために少しnuttynibblesを改造する必要があるかもしれません。 –

関連する問題