Php 使用REGEXP和内爆时转义方括号
我在mysql表中有一个名为的数组和一个名为全名的列(名字有时放在方括号中)。正确的mysql语句如何比较数组的元素和列的元素,并且仅当名字在数组中并且也在方括号中时才返回全名Php 使用REGEXP和内爆时转义方括号,php,mysql,regex,Php,Mysql,Regex,我在mysql表中有一个名为的数组和一个名为全名的列(名字有时放在方括号中)。正确的mysql语句如何比较数组的元素和列的元素,并且仅当名字在数组中并且也在方括号中时才返回全名 id | full_names ----------------------------------- 1 | [John] Mclay 2 | [John] Rossi 3 | Will John 4
id | full_names
-----------------------------------
1 | [John] Mclay
2 | [John] Rossi
3 | Will John
4 | [Brian] Cosby
5 | Brian O'neal
因此,我希望只有第一个、第二个和第四个全名。
我的问题是因为方括号。数组中的每个名称都有2个方括号,对于每个名称,我必须使用
\\
两次以转义特殊字符。但我怎么能把它和内爆结合起来写呢?提前谢谢你 在发送到内爆之前,使用类似于array\u map的内容修改names\u数组是否有帮助
未经测试的示例:
$names_for_regex = array_map(function($name){
return preg_quote($name) ; // the next statement might be more suitable
return '('.preg_quote($name).')' ;
}, $names);
但我怎么能把它和内爆结合起来写呢
将给我这样一个字符串\[John\]\\[Brian\]
。但这不是我想要的
这是预期的行为,因为“|
”是一个regex元字符。因此,首先对$names\u数组中的正则表达式元字符进行转义:
// Loop the array and escape each item with preg_quote
foreach($names_array as $index => $name) {
$names_array[$index] = preg_quote($name);
}
然而,为了将其作为字符串传递给MySQL,还需要转义反斜杠和单引号。我们可以在这里使用:
注意:此操作应使用。这只是这个问题的范围
现在,我们终于可以添加管道进行替换了
你还有一件事要纠正。您使用的是[[:>:]]
,它与前面有单词字符但后面没有单词字符的位置相匹配。但是,“]
”不是一个单词字符。所以它与你的例子不符
如果要检查名称后是否有空格“
”,只需将其放入您的模式中:
$sql_query="SELECT full_names FROM myTable
WHERE full_names REGEXP '^(".implode("|", $names_array).") '";
^
(here) ^
代码:
$sql\u查询的值:
MySQL查询结果:
用于转义元字符。。另外,请将问题标记为$impl_string=implode(“|”,$names_array)
会给我一个这样的字符串:[John]\[Brian]
和preg\\\'(impl\u string,\\\')
会给我一个这样的字符串\[John\]\\\[Brian\]
。但这不是我想要的。在内爆之前使用preg\u quote
,因为@gyaani已经回答了无需分组。第一个函数行看起来有效
// Escape backslashes and single quotes for SQL
$names_array = str_replace( array("\\","'"), array("\\\\","\\'"), $names_array);
$sql_query="SELECT full_names FROM myTable
WHERE full_names REGEXP '^(".implode("|", $names_array).") '";
^
(here) ^
$names_array = array("[John]" ,"[Brian]");
// Loop the array and escape each item with preg_quote
foreach($names_array as $index => $name) {
$names_array[$index] = preg_quote($name);
}
// Escape backslashes and single quotes for SQL
$names_array = str_replace( array("\\","'"), array("\\\\","\\'"), $names_array);
// Now you can add "|"s that won't be escaped
$sql_query="SELECT full_names FROM myTable
WHERE full_names REGEXP '^(".implode("|", $names_array).") '";
SELECT full_names FROM myTable
WHERE full_names REGEXP '^(\\[John\\]|\\[Brian\\]) '
[John] Mclay
[John] Rossi
[Brian] Cosby