我使用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>
所以我该怎么做
答案 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",'<',$input);
?preg_match('#title[^>]*>(.*)</title#', $input, $matches)
?)或substr做一些事情,但你可能只是做了一个溪。
答案 1 :(得分:0)
<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);
}