这是一个简单的例子:
文字:<input name="zzz" value="18754" type="hidden"><input name="zzz" value="18311" type="hidden"><input name="zzz" value="17138" type="hidden">
正则表达式:/<input.*?value="(18754|17138)".*?>/
当匹配项被空字符串替换时,结果为空字符串。我预计中间<input>
会保留,因为我使用非贪婪匹配(.*?
)。任何人都可以解释为什么它被删除?
答案 0 :(得分:5)
有两场比赛:
<input name="zzz" value="18754" type="hidden">
<input name="zzz" value="18311" type="hidden"><input name="zzz" value="17138" type="hidden">
在第二种情况下,第一个.*?
匹配name="zzz" value="18311" type="hidden"><input name="zzz"
。这是一场比赛,而且非贪婪。
答案 1 :(得分:2)
aix已经解释过,为什么它与中间部分匹配。
要避免此行为,请删除.*?
,而不是尝试:
/<input[^>]*value="(18754|17138)"[^>]*>/
不是匹配任何字符,而是匹配任何字符,但“&gt;”
答案 2 :(得分:0)
aiz的答案是正确的 - 第二个匹配包括第二和第三个输入标签。
正则表达式的一个可能解决方法是将.
更改为[^>]
,如下所示:
/<input[^>]*?value="(18754|17138)"[^>]*?>/
这将使其匹配除 >
之外的任何字符。但是,只要>
显示在引用的文字中,就会出现明显的问题。每个人都说:Regexes aren't designed to work on HTML。除非别无选择,否则不要使用它们。