2012-10-04 27 views
2

我使用我的主题的字符串是:PHP 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'像它应该,但我不能让同样的事情上发言全文工作。

回答

1

为什么加一个问号的第一个通配符作品后,该原因,就是.*贪婪和问号(.*?)使得。一个贪婪的运营商将尽可能匹配,在你的情况是整条线(.*说“尽可能多次匹配任何东西”)。使其懒惰将导致它尽可能少地匹配。在PCRE手册页的repetition section中阅读更多关于此的内容。

对于您的特定问题,使用懒惰运算符有什么问题?如果它导致你想要的东西,我会说去吧。

0

从正则表达式的开头和结尾除去\ b和。*。即使是全部文本,你也不需要这些。请参阅:

http://rubular.com/r/jYjS5WASTw

+0

工作正常,但我忘了提到它需要与MySQL的函数的preg_replace工作为好,这可悲的是没有在PHP版本中的所有功能。忘记提及这是我的错。但是,否则谢谢。 –

+0

当然这仍然会工作... – trickyzter