对于搜索功能,我编写了一个由
PHP脚本执行的MySQL查询.我没有进行全文搜索.相反,我正在使用以下方法进行搜索:
原文链接:https://www.f2er.com/php/134052.html… WHERE字段LIKE’%etc%’和字段REGEXP'[[:<:]]等[[:>:]]’
现在,我的想法是在PHP中准备这些动态值,例如:
$word = '2*3%5_1^0'; // just an example $wordLike = strtr($word,array('\\'=>'\\\\','%'=>'\\%','_'=>'\\_')); // instead of my old solution: // $wordLike = preg_replace('~([%_])~','\\\\$1',$word); $wordLike = $db_con->escape('%' . $wordLike . '%'); $spaces = '[[:blank:]]|[[:punct:]]|[[:space:]]'; // I'm not sure about the difference between blank & space,though $wordRX = preg_quote($word); $wordRX = $db_con->escape('(^|'.$spaces.')'.$wordRX.'($|'.$spaces.')'); // instead of my old solution: // $wordRX = $db_con->escape('[[:<:]]' . $wordRX . '[[:>:]]');
然后使用这些值,如…
… WHERE字段LIKE’$wordLike’和字段REGEXP’$wordRX’
通过此示例输入,结果
... WHERE field LIKE '%2*3\\%5\\_1^0%' AND field REGEXP '[[:<:]]2\\*3%5_1\\^0[[:>:]]`
几个笔记……
>在我的实际代码中,我正在处理多个单词,这只是伪代码.
>我用来搜索单词的方法 – 用LIKE& REGEXP在我尝试的方法中是最快的.
>我知道我应该使用PDO,除非与我的问题相关,否则请不要输入任何内容
一些额外的信息
关于MysqL REGEXP ……
以下字符由preg_quote()转义
. \ + * ? [ ^ ] $( ) { } = ! < > | : –
以下是REGEXP中[偶尔]特殊字符的列表
. \ + * ? [ ^ ] $( ) { } | –
REGEXP中还有其他构造,但它们都被单/双括号包围,因为我知道所有括号都将被preg_quote()转义,我觉得我不应该关注它们.
关于MysqL LIKE ……
LIKE中只有2个特殊字符
_ %
所以逃避他们似乎足够的解决方法.
如果我遗漏任何东西,请纠正我.