10.4 $query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');Esta consulta proporciona una búsqueda solo con palabras completas y funciona bien sin caracteres especiales.
foo (bar baz) $string = "(bar"; $query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]'); SQLSTATE[42000]: Syntax error or access violation: 1139 Got error 'missing ) Ahora probé con addcslashes y preg_quote . Logré escapar ( carácter con preg_quote pero el filtro no funcionará para esa cadena porque el filtro funciona con palabras completas.
También se agradecerá cualquier sugerencia para filtrar mejor la palabra completa.
foo(bar baz $filter = 'foo(bar'; $query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]'); Si ( se escapará, la búsqueda no funcionará
Hay muchos signos de puntuación que tienen un significado especial en las cadenas REGEXP . ( es sólo uno de muchos.
Si el objetivo es la búsqueda de los 4 caracteres (bar con un "límite de palabra" final), entonces uno de estos puede funcionar, dependiendo de la versión de MySQL/MariaDB y qué escape se necesita para llegar desde su aplicación al servidor:
\(bar[[:>:]] \\(bar[[:>:]] \\\\(bar[[:>:]] [(]bar[[:>:]] \(bar\b \\(bar\\b \\\\(bar\\\\b [(]bar\b [(]bar\\b [(]bar\\\\bEn cualquier caso, su aplicación debe escapar. Dado eso, puede ser mejor eliminar la puntuación:
[[:<:]]bar[[:>:]] \bbar\b \\bbar\\b \\\\bbar\\\\b Considere también usar LIKE "(bar"
Considere también usar un índice FULLTEXT
MATCH(col) AGAINST("bar" IN BOOLEAN MODE)Para obtener el máximo rendimiento, esto puede ser lo mejor (con un índice FULLTEXT):
MATCH(col) AGAINST("bar" IN BOOLEAN MODE) AND col LIKE "(bar"Prueba esto: $string = '\(bar';
Siempre puede verificar su patrón de expresiones regulares aquí: https://regex101.com/
Como puede ver, la biblioteca de expresiones regulares de ICU que está utilizando considera que los corchetes son especiales y requiere un escape de doble barra. El uso add_slashes() no es útil porque agregaría barras cuando lo requieran otras bibliotecas que no son ICU, y podría darte una cadena que no es apropiada para ella (por ejemplo, no escaparía de los corchetes).
Es posible que tenga más suerte con escapeshellcmd() debido al hecho de que los corchetes y los corchetes son, por casualidad, ambos metacaracteres de shell, pero también lo son el signo de dólar y el signo de hash y esto podría morderlo en la espalda más tarde.
La solución más simple sería reemplazar manualmente los cuatro caracteres que necesita (en realidad, tres , () [, pero para completar...).
$string = preg_replace( '#([(\\[\\])])#', '\\\\\\\\\1', // Hilarious, isn't it? $string ); $query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');