документ php dom удалить специальные символы - PullRequest
2 голосов
/ 07 июля 2011

я использую документ dom getElementsByTagName для получения заголовка веб-сайта.

вот мой код:

$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; }".

я сделал следующее, чтобы заменить специальные символы, но это не сработало:

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

    }

Вместо этого я получаю пустой заголовок. Значение <title> выглядит примерно так:

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

так что мне делать

Ответы [ 3 ]

1 голос
/ 07 июля 2011

Похоже, ваш 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 голосов
/ 07 июля 2011
$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 голосов
/ 07 июля 2011

я посмотрел сайт;и это проблема, потому что они не используют надлежащие html-сущности в заголовке:

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

Я предполагаю, что у DOMDocument есть проблема с этим, и думает, что именно там заканчивается тег.В качестве обходного пути вы можете добавить '<' к $ specialChars, чтобы избежать этой проблемы. </p>

...