使用正则表达式识别标题标记

时间:2017-04-30 15:54:05

标签: php regex html-parsing

我有一个代表title标记的字符串:

$fp = '<title>This is my title</title>';

我使用下面的正则表达式将上面的字符串识别为标题:

$res = preg_match("/<title>(.*)<\/title>/siU", $fp, $title_matches);

问题是某些标题具有如下所示的某些参数:

<title itemprop="name">This is my title</title>

因此,正则表达式无法处理这种类型的标题,在这种情况下,如何更新我的正则表达式以识别这两种标题?

4 个答案:

答案 0 :(得分:3)

不要使用正则表达式来解析html,使用html解析器,例如DOMDocument,即:

$dom = new DOMDocument();
$dom->loadHTML($fp);
$tags =  $dom->getElementsByTagName('title');

foreach($tags as $tag)
{
    print $tag->nodeValue;
}

如果您只需要1个标签,则可以使用:

$dom = new DOMDocument();
$dom->loadHTML($fp);
print $dom->getElementsByTagName('title')[0]->nodeValue;
# or
$xpath = new DOMXpath($dom);
print $xpath->query("//title")[0]->nodeValue;

答案 1 :(得分:1)

使用解析器是一种更好的方法,但您可以在title元素中查找非大于符号。

<title[^>]*>(.*)<\/title>

演示:https://regex101.com/r/BLllhw/1/

答案 2 :(得分:1)

基本上来自评论的@ chris85想法,但是经过精心调整。

$res = preg_match("/<title[^>]*>(.*)<\/title>/siU", $fp, $title_matches);

答案 3 :(得分:1)

希望这会帮助你..

正则表达式: <title[^>]*>\s*\K.*?(?=<\/title>)

  

1。 <title[^>]*>这将与<title匹配,直到>

     

2. \s*\K.*?(?=<\/title>)*可选地包含空格\s*\K将重置当前匹配,.*?这将匹配所有直到并积极向前看</title>)

Try this code snippet here

<?php
ini_set('display_errors', 1);
$fp='<title itemprop="name">This is my title</title>';
$res = preg_match("/<title[^>]*>\s*\K.*?(?=<\/title>)/", $fp, $title_matches);
print_r($title_matches);

<强>输出:

Array
(
    [0] => This is my title
)