Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

358
Vistas
Use SQL REGEXP (mariadb) para filtrar en dónde con caracteres especiales en Laravel

mariadb versión 10.4

 $query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');

Esta consulta proporciona una búsqueda solo con palabras completas y funciona bien sin caracteres especiales.

Ejemplo

Fila de búsqueda:
 foo (bar baz)
Filtrar:
 $string = "(bar"; $query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');
Error:
 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.

Un ejemplo más

Fila de búsqueda:
 foo(bar baz
Filtrar:
 $filter = 'foo(bar'; $query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');

Si ( se escapará, la búsqueda no funcionará

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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\\\\b

En 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"
over 4 years ago · Santiago Trujillo Denunciar

0

Prueba esto: $string = '\(bar';

Siempre puede verificar su patrón de expresiones regulares aquí: https://regex101.com/

over 4 years ago · Santiago Trujillo Denunciar

0

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.'[[:>:]]');
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda