多回顾后发正则表达式

问题描述:

我有文字多回顾后发正则表达式

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

和regexpr

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

这给了我1门匹配阵列(组)为:

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

) 

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

+1

这是XML吗?如果是这样,你会更好使用XML解析器 – 2015-02-05 14:09:17

+0

@Alex K不,它是我有的简化的HTML。解析器可能会更好,但无论如何regexpr对我很有趣 – amplifier 2015-02-05 14:17:35

+0

为什么你需要2个不同的数组? – anubhava 2015-02-05 14:29:52

$0通常是充分的匹配。只得到2个阵列可以在先行捕捉surname

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

Test at regex101;如果需要,使用sflag使点也匹配换行符。

只需使用捕获组。名称存储组索引1的内部和姓氏存储组索引内部2.

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

DEMO

+0

我检查它在https://www.myregextester.com/index.php它给我3阵列 – amplifier 2015-02-05 14:32:51

另一种方法:

考虑使用:使用tag阵列和value阵列

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

现在你可以匹配条目:

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

这将给以下内容$matches阵列。