多个Lookbehind正则表达式

时间:2015-02-05 14:08:02

标签: regex

我有文字

aaabbbbbabbbbab<name>NAME1</name>qweqwe<surname>SURNAME1</surname>
<name>NAME2</name>qweeeeeeeeeeeeeeeeqwe<surname>SURNAME1</surname>

和regexpr

 (?<=<name>).+?(?=<\/name>)|(?<=<surname>).+?(?=<\/surname>)

给了我一个匹配的数组(组):

(
    [0] => Array
        (
            [0] => NAME1
            [1] => SURNAME1
            [2] => NAME2
            [3] => SURNAME1
        )

)

我如何更改正则表达式以获得2个匹配的数组(1表示名称,2表示姓氏)

3 个答案:

答案 0 :(得分:1)

$0通常是完全匹配。要获得2个数组,可以在前瞻中捕获surname

(?<=<name>)[^<]+(?=.*?<surname>([^<]+))

Test at regex101;与s flag一起使用可以根据需要使点也匹配换行符。

答案 1 :(得分:0)

只需使用捕获组。名称存储在组索引1中,姓氏存储在组索引2中。

(?<=<name>)(.+?)(?=<\/name>)|(?<=<surname>)(.+?)(?=<\/surname>)

DEMO

答案 2 :(得分:0)

替代方法:

考虑使用:

preg_match_all('~<(?<tag>name|surname)>(?<value>.+?)</\1>~is', $input, $matches);

这将在$matches数组中提供以下内容:

Array (
    ...
    [tag] => Array (
            [0] => name
            [1] => surname
            [2] => name
            [3] => surname
        )
    [value] => Array (
            [0] => NAME1
            [1] => SURNAME1
            [2] => NAME2
            [3] => SURNAME1
        )    
)

现在,您可以使用tag数组和value数组匹配条目。