Php 使用正则表达式识别标题标记
我有一个表示Php 使用正则表达式识别标题标记,php,regex,html-parsing,Php,Regex,Html Parsing,我有一个表示标题标记的字符串: $fp = '<title>This is my title</title>'; $fp='这是我的标题'; 我使用下面的正则表达式将上面的字符串识别为标题: $res = preg_match("/<title>(.*)<\/title>/siU", $fp, $title_matches); $res=preg_匹配(“/(.*))/siU“,$fp,$title_匹配); 问题在于,某些标题具有如下某些
标题标记的字符串:
$fp = '<title>This is my title</title>';
$fp='这是我的标题';
我使用下面的正则表达式将上面的字符串识别为标题:
$res = preg_match("/<title>(.*)<\/title>/siU", $fp, $title_matches);
$res=preg_匹配(“/(.*))/siU“,$fp,$title_匹配);
问题在于,某些标题具有如下某些参数:
<title itemprop="name">This is my title</title>
这是我的标题
因此,正则表达式无法处理此类标题,在这种情况下,我如何更新正则表达式以识别这两个标题?使用解析器将是更好的方法,但您可以在title
元素中查找非大于符号
<title[^>]*>(.*)<\/title>
]*>(*)
演示:基本上是评论中的@chris85想法,但经过了微调
$res = preg_match("/<title[^>]*>(.*)<\/title>/siU", $fp, $title_matches);
$res=preg_匹配(“/]*>(.*)/siU“,$fp,$title_匹配);
希望这能帮到你
正则表达式:]*>\s*\K.*(?=)
1.]*>
这将匹配
2.\s*\K.*(?=)*
可选包含空格\s*
,\K
将重置当前匹配,*?
这将匹配所有内容,直到并积极展望)
不要使用正则表达式解析html
,使用html
解析器,类似于DOMDocument
,即:
$dom = new DOMDocument();
$dom->loadHTML($fp);
$tags = $dom->getElementsByTagName('title');
foreach($tags as $tag)
{
print $tag->nodeValue;
}
如果您只需要一个标签,您可以使用:
$dom = new DOMDocument();
$dom->loadHTML($fp);
print $dom->getElementsByTagName('title')[0]->nodeValue;
# or
$xpath = new DOMXpath($dom);
print $xpath->query("//title")[0]->nodeValue;
不要使用正则表达式来解析html,使用一个html解析器,类似DOMDocument的东西会给出更多的例子来说明为什么不想用正则表达式来解析html。什么是微调的?这不是我的答案/评论吗?这是你的答案,我们同时创建的。根据您(现在已删除)的评论进行了微调,不需要至少一个非
。抱歉,我以为您已经完成并继续了。@chris85 yaah。。我想你是对的。。。让我检查一下..@SahilGulati虽然我很感激学习\K
,但我仍然想知道为什么要这么做。OP似乎对使用捕获组感到满意,我(目前缺乏经验)认为重置结构对于相同的结果更加努力。(顺便说一句,我删除了其他评论,您可能也希望这样做,以尽量减少对其他人的混淆。)如果是$fp=“\n这是我的标题\n\n”
?如果有两个
标记,但第一个标记被注释掉了怎么办?这应该是正确的答案。
$dom = new DOMDocument();
$dom->loadHTML($fp);
$tags = $dom->getElementsByTagName('title');
foreach($tags as $tag)
{
print $tag->nodeValue;
}
$dom = new DOMDocument();
$dom->loadHTML($fp);
print $dom->getElementsByTagName('title')[0]->nodeValue;
# or
$xpath = new DOMXpath($dom);
print $xpath->query("//title")[0]->nodeValue;