我希望在a[b=1]
中获得c& d's内容。但现在我只能得到content1.1。
有谁可以告诉我为什么(<d>(.+)</d>\s+)+
无法匹配所有d
?我找不到有关此表达式的任何错误。
感谢。
<?php
$a = "
<a b=1>
blabla
<c>content1:</c>
<d>content1.1</d>
<d>content1.2</d>
<c>content2:</c>
<d>content2.1</d>
</a>
<a b=2>
blabla
<c>content1:</c>
<d>content1.1</d>
</a>
";
preg_match_all("|<a b=1>.+(<c>(.+):</c>\s+(<d>(.+)</d>\s+)+)+.+</a>|isU", $a, $tmp);
var_dump($tmp);exit;
答案 0 :(得分:1)
我尝试了DOM,但它无法加载HTML
我认为你应该专注于为什么你不能用DOM解析HTML。 Regex不是解析HTML的工具,严重!
至于你的具体问题,因为它返回第一场比赛:
<a b=1>
blabla
<c>content1:</c>
<d>content1.1</d>≪≪-----here
<d>content1.2</d>
请记住,您正在使用U
标志,因此所有重复都会得到满足。正则表达式引擎尝试从那里开始第二场比赛,但它不会与你的整个表达相匹配。
如果您想匹配嵌套在<d>
中的所有<a b=1>
代码,您可以使用\G
assertion,它在主题的第一个匹配位置匹配。
<强>正则表达式强>
~\G(?:(?!\A)|.*<a b=1>)(?:(?!</a>).)+<d>(.+)</d>~isU