如何在PHP中使用正则表达式匹配一个&许多?

时间:2015-10-19 02:03:46

标签: php regex

我有一个不规则的代码,我尝试了DOM,但它无法正确加载HTML或loadXML。然后我必须使用正则表达式匹配特定内容。

我希望在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;

1 个答案:

答案 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

regex101 demo