2

我用作主题的字符串是:

'在 4 天/3 夜假期节省 68%。只需 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',但我无法在完整的声明中得到同样的结果。

4

2 回答 2

1

在第一个通配符之后添加问号起作用的原因.*贪婪,而问号(.*?)使它变得懒惰。贪婪的运算符将尽可能匹配,在您的情况下是整行(.*表示“尽可能多地匹配任何内容”)。让它变得懒惰会导致它尽可能少地匹配。在 PCRE 手册页的重复部分中阅读更多相关信息。

对于您的特定问题,使用惰性运算符有什么问题?如果结果是你想要的,我说随它去吧。

于 2012-10-04T17:49:34.320 回答
0

删除正则表达式开头和结尾的 \b 和 .*。即使有完整的文本,您也不需要这些。看:

http://rubular.com/r/jYjS5WASTw

于 2012-10-04T17:59:10.823 回答