正则表达式包括下一个词的出现

时间:2017-08-24 06:16:08

标签: php regex

正则表达式完美无缺,但问题是它还包括下一次出现而不是以第一次出现结束然后再从

开始

正则表达式: (?=<appView)\s{0,1}(.*)(?<=<\/appView>)

字符串: <appView></appView> <appView></appView>

但我的问题是,吃完就像

一样
  

(Match 1)<appView></appView> <appView></appView>

我希望它以不同的方式搜索群组,但我无法让它发挥作用。

  

所需输出:(匹配1)<appView></appView>(匹配2)<appView></appView>

2 个答案:

答案 0 :(得分:1)

\s{0,1}等于\s?您需要使用(.*?)来代替(.*)

使用此模式:~(?=<appView)\s?(.*?)(?<=</appView>)~

Demo Link

*请注意,如果使用斜杠以外的其他内容作为模式分隔符,则不必在结束标记中转义/。我在模式的开头和结尾使用~以避免转义。

答案 1 :(得分:0)

我完全建议从正则表达式切换到实际的顺序xml解析器。正则表达式对于解析基于xml的文件很有帮助,例如由于下面的问题。

那说,你可以修复&#34;你的正则表达式使用([^<>]*)。这将匹配没有<>的所有字符,这将确保没有其他标记嵌套在里面。如果使用所有代码,则无法匹配<appview><unclosedTag></appView>之类的内容,因为它无效。如果您可以确定结构是正确的,那么这个问题就不那么重要了。

您的方法遇到的另一个问题是,如果您有嵌套标签,请执行以下操作:<appView> something <appView> something else </appView> else </appView>,您的方法会让您最终得到[replaced] else </appView>