PHP使用preg_match从文章中获取标题

时间:2010-08-22 14:00:00

标签: php regex

我在使用preg_match时遇到了一个奇怪的问题。我正在使用一个抓取文章标题的正则表达式,基本上寻找标签:

preg_match('#(\<title.*?\>)(\n*\r*.+\n*\r*)(\<\/title.*?\>)#', $data, $matches)

当我打印出$ matches数组时,我什么都没得到。但是当我在正则表达式测试器中尝试相同的东西时,它工作正常。我甚至试过放入一个绝对匹配它的字符串代替$ data变量,没有任何运气。

我在这里做错了什么?

6 个答案:

答案 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);

从此: https://gist.github.com/jeremiahlee/785770

答案 3 :(得分:0)

您可能需要反斜杠引用反斜杠。

PHP的字符串解析器删除了一层反斜杠,然后正则表达式引擎占用了另一层,因此(例如)识别反斜杠需要在源代码中使用其中的四个。

除此之外,您可以尝试利用PHP中的XML识别功能,或者不那么聪明的字符串处理。通常当REGEXs破裂时,这是因为你试图对它们过于聪明。考虑只查看“并删除整个标题标签,然后从字符串中删除空格,以及VOILA!标题。

另见http://php.net/manual/en/book.simplexml.php

答案 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>"
)