PHP正则表达式。正在搜索双引号?

时间:2012-08-04 22:07:19

标签: php regex

我正在编写一个PHP网页,它从搜索框中获取数据并使用它来搜索mysql数据库并返回结果。目前它只使用mySQL LIKE查询提供的所有数据。这不是很灵活,因为它将数据视为匹配的单个精确表达式。

快速谷歌后我找到了这个页面(http://www.iamcal.com/publish/articles/php/search/),我打算用它来扩展我的搜索网页的功能。

但是我对该网页上的教程有两个疑问:

1)本教程的第一部分是:

$terms = preg_replace("/\"(.*?)\"/e", "search_transform_term('\$1')", $terms);

我不明白为什么*后跟一个?,正如我所理解的那样。*表示一个字符(可以是任何字符)零次或多次,这意味着任何字符串。的?意味着零次或一次。因此没有。*?也意味着任何字符串?

2)我的第二个问题是如何使表达式替换语音标记中包含的表达式而不是括号?

3 个答案:

答案 0 :(得分:2)

回答1。

。*?表示该运算符。* 是懒惰的。这意味着什么。

正则表达式中的每个运算符都是贪婪的,它试图找到最大值,添加?它变得懒惰,它试图找到最低限度。

当我使用

preg_replace("/_(.*)_/","Hi,_first_ and _second_ element","!replaced!");

输出

Hi,!replaced! element 

因为它找到了最多的文本,但在这种情况下:

preg_replace("/_(.*?)_/","Hi,_first_ and _second_ element","!replaced!");

输出

Hi,!replaced! and !replaced! element 

因为它试图找到与正则表达式匹配的最小文本。

我希望这已经足够了,因为我不知道如何更好地解释它:D

答案 1 :(得分:1)

问号使得匹配非贪婪,以便php在遇到“char。”之前尝试匹配尽可能少的字符。

答案 2 :(得分:0)

  • 星号(*)允许点重复任意次数,包括 零。
  • 问号(?)使前面的标记成为常规的 表达可选。例如:colou?r匹配颜色和颜色。