我有一个代表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>
因此,正则表达式无法处理这种类型的标题,在这种情况下,如何更新我的正则表达式以识别这两种标题?
答案 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)
答案 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>)
<?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
)