PHP preg_replace,而不是替换正确的值

时间:2012-10-04 17:43:34

标签: php regex preg-replace

我用作主题的字符串是:

  

'节省68%的4天/ 3晚假期。只需249美元!'

我正在使用'.\*(\b((enjoy|save)( up to| an extra)?|starting at|as low as|just|only)\b ([0-9]{1,3} ?\%|\$[0-9]+(\.[0-9]{2})?)).\*/i'尝试匹配上述字符串的一部分并将其解压缩。

我正在使用'$1'替代,所以我的preg_match看起来像

preg_match('.*(\b((enjoy|save)( up to| an extra)?|starting at|as low as|just|only)\b ([0-9]{1,3} ?\%|\$[0-9]+(\.[0-9]{2})?)).*/i', '$1', 'Save 68% on a 4 Day/3 Night vacation at. Only $249!')

它应首先与'Save 68%'匹配,但它会一直返回'Only $249'

我发现如果我在第一个通配符'.\*?(\b((enjoy|save)( up to| an extra)?|starting at|as low as|just|only)\b ([0-9]{1,3} ?\%|\$[0-9]+(\.[0-9]{2})?)).\*/i'之后添加问号,则会返回'save 68%'。还有另外一种解决方法。这似乎与我的分组有关。正如我发现的那样

preg_match('/.*\b(enjoy|save)( up to| an extra)?|starting at|as low as|just|only\b.*/i', '$1', 'Save 68% on a 4 Day/3 Night vacation at. Only $249!')

会像它应该的那样返回'save',但我无法在完整的陈述中使用同样的东西。

2 个答案:

答案 0 :(得分:1)

在第一个通配符之后添加问号的原因是.* 贪婪,问号(.*?)使其懒惰。贪婪的运算符将尽可能匹配 ,在您的情况下是整行(.*表示“尽可能多地匹配任何内容”)。使其变得懒惰将使其与尽可能少地匹配。请在PCRE手册页的repetition section中了解更多相关信息。

对于您的特定问题,使用惰性运算符有什么问题?如果它产生你想要的东西,我会说它。

答案 1 :(得分:0)

从正则表达式的开头和结尾删除\ b和。*。即使有完整的文本,你也不需要那些。参见:

http://rubular.com/r/jYjS5WASTw