preg_match_all问题(如何在没有单独的preg_match调用的情况下限制范围)

时间:2009-09-16 14:43:08

标签: php regex

我有一些类似的数据:

aaa1|aaa2|ZZZ|aaa3|aaa4|aaa5|ZZZ|aaa6|aaa7

我希望匹配所有“aaa [0-9]”BETWEEN“ZZZ”(不是外面的那些)。


所以我有一些PHP代码:


    $string = "aaa1aaa2zzzzaaa3aaa4aaa5zzzzaaa6aaa7";

    preg_match_all("/zzzz.*(aaa[0-9]).*zzzz/", $string, $matches, PREG_SET_ORDER);

    print_r($matches);

但它只输出:

Array
(
    [0] => Array
        (
            [0] => zzzzaaa3aaa4aaa5zzzz
            [1] => aaa5
        )

)

除了“aaa5”之外,我想要“aaa3”,“aaa4”。

有没有办法通过1次调用preg_match_all()来执行此操作?

2 个答案:

答案 0 :(得分:1)

检查字符串是否出现在一个分隔符字符串(zzzz)之前,而不是在两个分隔符字符串之前:

$string = "aaa1aaa2zzzzaaa3aaa4aaa5zzzzaaa6aaa7";

preg_match_all("/aaa[0-9](?=.*?zzzz)(?!(?>.*?zzzz).*?zzzz)/", $string, $matches, PREG_SET_ORDER);

print_r($matches);

答案 1 :(得分:0)

我认为通过一次通话无法做到这一点。你需要做一个调用来拉出你的分隔符之间的内容(zzzz)然后另一个调用来拉出所有匹配的对。

if (preg_match('/zzzz(.*?)zzzz/', $string, $matches)) {
    preg_match_all('/(aaa\d)/', $matches[1], $newmatches);
    print_r($newmatches);
} else {
    echo "No match";
}