我在使用preg_match时遇到了一个奇怪的问题。我正在使用一个抓取文章标题的正则表达式,基本上寻找标签:
preg_match('#(\<title.*?\>)(\n*\r*.+\n*\r*)(\<\/title.*?\>)#', $data, $matches)
当我打印出$ matches数组时,我什么都没得到。但是当我在正则表达式测试器中尝试相同的东西时,它工作正常。我甚至试过放入一个绝对匹配它的字符串代替$ data变量,没有任何运气。
我在这里做错了什么?
答案 0 :(得分:6)
如果您仍想使用regex
而不是DOM
,请执行以下操作:
if(preg_match("/<title>(.+)<\/title>/i", $data, $matches))
print "The title is: $matches[1]";
else
print "The page doesn't have a title tag";
答案 1 :(得分:1)
或者你可以使用HTML的HTML解析器:
$dom = new domDocument;
$dom->loadHTML($HTML);
echo $dom->getElementsByTagName('title')->item(0)->nodeValue;
答案 2 :(得分:1)
为我工作:
preg_match("/<title>(.*)<\/title>/is", $html, $matches);
答案 3 :(得分:0)
您可能需要反斜杠引用反斜杠。
PHP的字符串解析器删除了一层反斜杠,然后正则表达式引擎占用了另一层,因此(例如)识别反斜杠需要在源代码中使用其中的四个。
除此之外,您可以尝试利用PHP中的XML识别功能,或者不那么聪明的字符串处理。通常当REGEXs破裂时,这是因为你试图对它们过于聪明。考虑只查看“并删除整个标题标签,然后从字符串中删除空格,以及VOILA!标题。
答案 4 :(得分:0)
试试这个
if (preg_match('%(<title.*?\b(?!\w))(\n*\r*.+\n*\r*)(\b(?=\w)/title.*?\b(?!\w))%', $data, $matches)) {
$title = $matches[1];
} else {
$title = "";
}
答案 5 :(得分:0)
与其他人一样,这里有“使用解析器,而不是正则表达式”的免责声明。但是,如果您仍然需要正则表达式,请查看:
$string = "<title>I am a title</title>";
$regex = "!(<title[^>]*>)(.*)(</title>)!i";
preg_match($regex, $string, $matches);
print_r($matches);
//should output:
array(
[1] => "<title>"
[2] => "I am a title"
[3] => "</title>"
)