1

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

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

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

1)教程的第一部分是这样的:

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

我不明白为什么 * 后面跟着一个?,据我了解,.* 表示一个字符(可以是任何字符)零次或多次,这表示任何字符串。这 ?表示零次或一次。因此没有.*?也意味着任何字符串?

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

4

3 回答 3

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

于 2012-08-04T22:22:31.717 回答
1

问号使匹配不贪心,以便 php 在遇到 " 字符之前尝试匹配尽可能少的字符。

于 2012-08-04T22:10:24.867 回答
0
  • 星号 (*) 允许点重复任意次数,包括零次。
  • 问号 (?) 使正则
    表达式中的前面的标记是可选的。例如:colou?r 匹配颜色和颜色。
于 2012-08-04T22:27:14.013 回答