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;