Php 使用REGEXP和内爆时转义方括号

Php 使用REGEXP和内爆时转义方括号,php,mysql,regex,Php,Mysql,Regex,我在mysql表中有一个名为的数组和一个名为全名的列(名字有时放在方括号中)。正确的mysql语句如何比较数组的元素和列的元素,并且仅当名字在数组中并且也在方括号中时才返回全名 id | full_names ----------------------------------- 1 | [John] Mclay 2 | [John] Rossi 3 | Will John 4

我在mysql表中有一个名为的数组和一个名为全名的列(名字有时放在方括号中)。正确的mysql语句如何比较数组的元素和列的元素,并且仅当名字在数组中并且也在方括号中时才返回全名

   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