php dom文档删除特殊字符

时间:2011-07-07 03:08:04

标签: php domdocument

我使用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 个答案:

答案 0 :(得分:1)

看起来您的HTML格式不正确。如果标题中有一个迷路<,我很惊讶你没有得到Warning: DOMDocument::loadHTML(): error parsing attribute name in Entity, line: 1 in <path> on line <line>

关于替换:如果替换html文档中的所有<>,您将无法从中检索元素:不会有任何元素:< / p>

<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做一些事情,但你可能只是做了一个溪。

答案 1 :(得分:0)

我看了一下网站;这是一个问题,因为他们没有在标题中使用正确的html实体:

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

我认为DOMDocument存在问题,并认为这是标记结束的地方。作为一种解决方法,您可以添加'&lt; '$ specialChars躲避这个问题。

答案 2 :(得分: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);
}