регулярное выражение нескольких скобок - PullRequest
0 голосов
/ 26 января 2011
$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)

Все возвращающиеся (а)

Я хотел бы также искать в любое время, когда я вижу это: <p>(a)(3)

Так что мне нужно второе значение, и его значение возвращается как (3)

И я не хочу никаких других значений +, таких как (a) или (10)

Ответы [ 2 ]

0 голосов
/ 08 августа 2011

Вы можете искать это:

$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)
0 голосов
/ 26 января 2011

Как насчет этого?

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