我想从网页中提取所有标题标记的内容。 我试过这个正则表达式
(?i)<h([1-6].*?)>(.*?)</h([1-6])>
问题是头标签是否像这样 -
<h1><I>Contents</I></h1>
它给我输出 -
<I>Contents</I>.
我希望它只打印
输出中的内容
。 我该如何修改?
答案 0 :(得分:0)
(?<=\>)(?!\<)(.*)(?=\<)(?<!\>)
即使输入为<h1><I>Contents</I></h1>
,这也能正常工作。在这里测试一下:https://regex101.com/r/tF7tG7/1
使用前瞻和后瞻,我总是检查捕获组的开头是否没有>
个字符。然后我捕捉到它们之间的一切。然后,我检查在我捕获的那个之前是否还有<
。查看前瞻和后视以获得更清晰的理解。
<?php
$string = "<h1><I>Contents</I></h1>";
preg_match("#(?<=\>)(?!\<)(.*)(?=\<)(?<!\>)#", $string, $matches);
var_dump($matches[1]);
请为了上帝之爱,不要使用正则表达式来解析任何形式的HTML或XML。
(?<=(?!h1|h2|h3|h4|h5|h6)\>)(?!\<)(.+?)(?=\<\/.+?(?=h1|h2|h3|h4|h5|h6))
此正则表达式按您希望的方式解析内容。在这里测试一下:https://regex101.com/r/vM1rI0/1