2012-10-04 90 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