正则表达式多个括号

时间:2011-01-25 22:43:30

标签: regex preg-match-all

$str = "<p>(a)(3) asdf (10) asdf</p>";

尝试使用php preg_match_all

拉出第二组括号

我正在解析非常大的文档,所以目前有这个:

preg_match_all("=(?:<p[^>]*>|<p[^>]*>Note|<i>|</i>)\((.*)\)=siU", $str, $matches);

拉这样的事情很好:

<p>(a)
<p>Note(a)
<i>(a)
</i>(a)

全部返回(a)

我也想在任何时候搜索:<p>(a)(3)

所以我需要第二个paren,它的值返回如(3)

我不想要任何其他paren +值,如(a)或(10)

2 个答案:

答案 0 :(得分:0)

这样的事情怎么样?

preg_match_all("=(?:<p[^>]*>(:?Note)?|</?i>)\((.*)\)(?:\((.*)\))?=siU", $str, $matches);

答案 1 :(得分:0)

你可能正在寻找这个:

$string = "<p>(a)(3)
<p>Note(ddd)ssssss(a)(3)
<i>dkdkdjkdjkdjkjdkjdk(3)
<i>abc(a)(9)
</i>(a)(3)";


preg_match_all('%<.*?>([\w]+)?(\(.*?\))?(\(3\))%i', $string, $result, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($result[0]); $i++) {
echo   $result[3][$i]."<br>" ;
}
回声:

(3)
(3)
(3)
(3)

如果您需要匹配您可能使用的整行:

preg_match_all('/(<.*?>([\w]+)?(\(.*?\))?(\(3\)))/i', $string, $result, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($result[1]); $i++) {
echo   $result[1][$i]."<br>" ; 
}

回声的:

<p>(a)(3)
<p>Note(ddd)ssssss(a)(3)
<i>dkdkdjkdjkdjkjdkjdk(3)
</i>(a)(3)