我正在编写一个PHP网页,它从搜索框中获取数据,并使用它搜索mysql数据库并返回结果。目前,它只对提供的所有数据使用mySQLLIKE查询。这不是很灵活,因为它将数据视为要匹配的单个精确表达式。
在快速搜索后,我发现了这个页面(http://www.iamcal.com/publish/articles/php/search/),我计划用它来扩展我的搜索网页的功能。
然而,我对该网页上的教程有两个疑问:
1) 教程的第一部分是:
$terms = preg_replace("/'"(.*?)'"/e", "search_transform_term(''$1')", $terms);
我不明白为什么*后面跟着一个?,据我所知,.*表示一个字符(可以是任何字符)零次或多次,表示任何字符串。这个表示零次或一次。所以没有。*?也指任何字符串?
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
问号使匹配不贪婪,因此php在遇到"char.
- 星号(*)允许点重复任意次数,包括零
- 问号(?)使前面的标记成为正则
表达式可选。例如:colou?r与颜色和颜色都匹配