2012-08-04 118 views
1

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

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

但是我有对网页教程两个查询:

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

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

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

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

+0

我不确定你在2) – 2012-08-04 22:11:02

+0

的意思是什么?preg_replace(“/\"(.*?)\"/e”,“search_transform_term('\ $ 1')”,$ terms);上面显示的函数用于查找所有括号对,并将其内容传递给search_transform_term以供进一步处理。我希望找到所有的语音标记对,并将其内容传递给search_transform_term以进一步处理。 – brnby 2012-08-04 22:18:43

+0

它在我看来它匹配所有引号对,而不是括号。我不确定什么是语音标记! :) – 2012-08-04 22:21:43

回答

1

问号使匹配非贪婪使PHP将试图尽可能少的字符可能遇到一个“字符之前匹配。

+1

这是有道理的,因为如果用户指定多个引号,。*只会找到一个报价,因为只有第一个和最后一个括号会被考虑在内,之间的任何括号将被视为引用的一部分。谢谢:) – brnby 2012-08-04 22:21:12

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

0
  • 星号(*)允许的点被重复任意次数,包括 为零。
  • 问号(?)使常规
    表达式中的前一个标记可选。例如:colou?r可以同时匹配颜色和颜色。
+1

不正确的答案 – 2012-08-04 22:44:33