我用作主题的字符串是:
'节省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'
,但我无法在完整的陈述中使用同样的东西。
答案 0 :(得分:1)
在第一个通配符之后添加问号的原因是.*
贪婪,问号(.*?
)使其懒惰。贪婪的运算符将尽可能匹配 ,在您的情况下是整行(.*
表示“尽可能多地匹配任何内容”)。使其变得懒惰将使其与尽可能少地匹配。请在PCRE手册页的repetition section中了解更多相关信息。
对于您的特定问题,使用惰性运算符有什么问题?如果它产生你想要的东西,我会说它。
答案 1 :(得分:0)
从正则表达式的开头和结尾删除\ b和。*。即使有完整的文本,你也不需要那些。参见: