Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

361
Views
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 answers
Answer question

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 Report

0

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

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

over 4 years ago · Santiago Trujillo Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!