gpt4 book ai didi

php - 使用 SQL REGEXP (mariadb) 过滤 Laravel 中带有特殊字符的地方

转载 作者:行者123 更新时间:2023-12-04 11:32:29 27 4
gpt4 key购买 nike

mariadb 版本 10.4

$query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');
此查询仅提供整个单词的搜索,并且在没有特殊字符的情况下工作正常。
例子
搜索行:
foo (bar baz)
筛选:
$string = "(bar";
$query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');
错误:
SQLSTATE[42000]: Syntax error or access violation: 1139 Got error 'missing )
现在我尝试使用 addcslashespreg_quote .我成功逃脱 (字符与 preg_quote但过滤器不适用于该字符串,因为过滤器适用于整个单词。
任何通过整个单词更好地过滤的建议也将不胜感激。
再举一个例子
搜索行:
foo(bar baz
筛选:
$filter = 'foo(bar';
$query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');
(将被转义搜索将不起作用

最佳答案

REGEXP中有很多标点符号有特殊意义字符串。 (只是其中之一。
如果目标是搜索 4 个字符 (bar带有尾随的“单词边界”,那么其中之一可能会起作用——这取决于 MySQL/MariaDB 的版本以及从您的应用程序到服务器所需的转义:

\(bar[[:>:]]
\\(bar[[:>:]]
\\\\(bar[[:>:]]
[(]bar[[:>:]]

\(bar\b
\\(bar\\b
\\\\(bar\\\\b
[(]bar\b
[(]bar\\b
[(]bar\\\\b
在任何情况下,您的应用程序都必须进行一些转义。鉴于此,删除标点符号可能会更好:
[[:<:]]bar[[:>:]]
\bbar\b
\\bbar\\b
\\\\bbar\\\\b
也考虑使用 LIKE "(bar"还可以考虑使用 FULLTEXT指数
MATCH(col) AGAINST("bar" IN BOOLEAN MODE)
为了获得最佳性能,这可能是最好的(使用 FULLTEXT 索引):
MATCH(col) AGAINST("bar" IN BOOLEAN MODE)
AND col LIKE "(bar"

关于php - 使用 SQL REGEXP (mariadb) 过滤 Laravel 中带有特殊字符的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68207679/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com