PHP - preg_replace con expresiones regulares y tíldes

 
Vista:
Imágen de perfil de Mk
Val: 50
Ha disminuido su posición en 35 puestos en PHP (en relación al último mes)
Gráfica de PHP

preg_replace con expresiones regulares y tíldes

Publicado por Mk (22 intervenciones) el 28/11/2020 18:11:22
Buenas,

llevo ya días intentando reemplazar palabras exactas con tílde por otras pero no consigo encontrar la expresión regular que lo haga.

Una expresión básica sería usando \bPalabra\b, esto funciona bien si ninguna palabra del texto a buscar es reemplazable parcialmente por esa. Por ejemplo (ejemplo real) tengo en mi texto la palabra vehículo y hago un regex de \bculo\b, si vehículo no tuviese tilde, la palabra vehículo no de debería reemplazar por nada, pero al llevar la tilde, la parte "culo" de vehículo se reemplaza obteniendo una palabra sin sentido (vehíPALABRA).

He probado de hacer esto: /(\bculo\b/um y en webs de testing de regex como regex101.com funciona bien el problema viene a la hora de ejecutarlo en php que me da el error Warning: preg_replace(): Compilation failed: invalid UTF-8 string at offset 1

Por lo tanto, con la expresión regular sin la /u reemplaza cosas que no debería y si pongo la /u peta... no se que es peor.

¿Alguien sabe como solucionar esto?

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

preg_replace con expresiones regulares y tíldes

Publicado por joel (1269 intervenciones) el 29/11/2020 11:07:06
Hola Mk, yo creo que tu problema es con la codificación de la cadena... yo he probado esto:
1
echo preg_replace("/\bculo\b/", "PALABRA", "vehículo");
y devuelve vehíPALABRA


Revisa la codificación de tu cadena con
1
mb_check_encoding($string, 'UTF-8');

Y prueba a convertirla a utf-8 con
1
utf8_encode($string)


Ya nos comentaras...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mk
Val: 50
Ha disminuido su posición en 35 puestos en PHP (en relación al último mes)
Gráfica de PHP

preg_replace con expresiones regulares y tíldes

Publicado por Mk (22 intervenciones) el 29/11/2020 14:16:35
Buenas, gracias por tu respuesta, siempre intentas ayudarme :)

He probado el mb_check_encoding y tanto la palabra como el texto donde se tiene que reemplazar están ya en UTF-8, igualmente he forzado la codificación con utf8_encode pero sigo obteniendo lo mismo.

Al hacer preg_replace("/\bculo\b/", "PALABRA", "vehículo"); el resultado es vehíPALABRA y yo lo que quiero es que no se reemplace ya que solo busco la palabra "culo" tal cual, suelta en el texto.

O sea un ejemplo absurdo:
1
2
$text = "Ese vehículo tiene un culo muy bonito";
preg_replace("/\bculo\b/", "PALABRA", $text);

El resultado esperado es: "Ese vehículo tiene un PALABRA muy bonito" y no "Ese vehíPALABRA tiene un PALABRA muy bonito" y todo esto se debe a que la tilde de la i lo interpreta como un espacio o algo...

¿Qué más puedo probar?

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

preg_replace con expresiones regulares y tíldes

Publicado por joel (1269 intervenciones) el 30/11/2020 08:18:12
Discúlpame Mk, no te entendí bien...

La manera que se me ocurre, es que lo revises manualmente... algo así:
1
[^A--ú](culo)\b

Te puede servir?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mk
Val: 50
Ha disminuido su posición en 35 puestos en PHP (en relación al último mes)
Gráfica de PHP

preg_replace con expresiones regulares y tíldes

Publicado por Mk (22 intervenciones) el 30/11/2020 08:49:19
Hola, gracias por tu respuesta pero no puedo hacerlo de manera estática porque ese regex lo uso para reemplazar miles de palabras. La funcionalidad que tengo es:
- Tengo un texto con montones de palabras y un diccionario de sinónimos. Por cada entrada del diccionario de sinónimos, busco esa palabra en el texto y la reemplazo por su sinónima.
Por lo tanto no puedo hacer nada manual, y el problema es de la tilde, por ser un caracter extraño que rompe el regex.

Necesito una expresión regular que me permita hacer eso reemplazando correctamente o conseguir solucionar el error de Warning: preg_replace(): Compilation failed: invalid UTF-8 string at offset 1 cuando digo que la expresión regular es unicode con el /u, que esto funciona bien en cualquier tester de expresiones regulares pero no en php.

Con la regex /\bculo\b/um, si la palabra es vehículo, se queda vehículo, pero en php peta por la /u.

1
2
$text = "Ese vehículo tiene un culo muy bonito";
preg_replace("/\bculo\b/u", "PALABRA", $text);

Resultado: Warning: preg_replace(): Compilation failed: invalid UTF-8 string at offset 1 aunque en regex101.com el resultado es correcto.

¿Más ideas?

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

preg_replace con expresiones regulares y tíldes

Publicado por joel (1269 intervenciones) el 30/11/2020 11:11:06
Hola Mk, pero eso que te he puesto es una expresión regular!!! porque dices que no es una expresión regular?

Lo que he intentado, es cambiar el \b por su equivalente mas largo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mk
Val: 50
Ha disminuido su posición en 35 puestos en PHP (en relación al último mes)
Gráfica de PHP

preg_replace con expresiones regulares y tíldes

Publicado por Mk (22 intervenciones) el 30/11/2020 11:39:51
Hola, disculpa no nos habíamos entendido jaja cosas de los escritos...

He probado ese regex pero no me acaba de funcionar (tampoco es que sepa mucho de expresiones regulares).

Lo que veo es lo siguiente:

- Aplicando el regex
1
[^A--ú](culo)\b
Si tengo solo la palabra "culo" no la encuentra, porque según veo, me pide que empiece por un espacio

- Para el caso de jugaré buscando "jugar" la encuentra:
1
[^A--ú](jugar)\b
y hago un reemplazo a la palabra jugaré con PALABRA me devuelve PALABRAé

Te agradezco mucho la ayuda de verdad, y más con estos temas de expresiones regulares que no domino en absoluto.

Seguro que acabamos encontrando la expresión que funcione para todos los casos :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

preg_replace con expresiones regulares y tíldes

Publicado por joel (1269 intervenciones) el 30/11/2020 15:49:15
Ya lo he encontrado MK!!!
Tienes que indicar que es unicode... así:

1
echo "<hr>".preg_replace("/\bculo\b/u", "X", "Ese vehículo tiene un culo o culote");
te devolvera:
1
Ese vehículo tiene un X o culote
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mk
Val: 50
Ha disminuido su posición en 35 puestos en PHP (en relación al último mes)
Gráfica de PHP

preg_replace con expresiones regulares y tíldes

Publicado por Mk (22 intervenciones) el 01/12/2020 08:18:50
Hola, nada...
si pongo la /u me da el otro error que había comentado, que dije que con eso petaba con el error
Warning: preg_replace(): Compilation failed: UTF-8 error: isolated byte with 0x80 bit set at offset 5
y no hace nada.

Rebuscando un poco más y probando combinaciones he dado con esta:
1
((?<=\s|^|>|\(|\"|\'|\¿|\¡)culo(?=\s|$|\.|,|;|<|\)|\"|\'|\?|\!))

Realmente no la acabo de entender del todo pero parece que funciona. No entiendo que es lo que significa lo que hay entre paréntesis, sobretodo la de cierre que tenga que poner los OR para puntos, comas... si no no lo hace bien y al inicio lo mismo. Deduzco que es que la palabra "empiece" o "termine" con alguno de los valores de los que hay entre paréntesis.

En definitiva con esta regex encuentra "culo" suelto pero no vehículo, en cualquier posición de la oración, así que bien :)
Igual pasa si busco por "jugar", no hace match a jugaré, así que parece que el tema de tildes queda resuelto, ahora falta comprender que es lo que hace exactamente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

preg_replace con expresiones regulares y tíldes

Publicado por joel (1269 intervenciones) el 04/12/2020 11:13:13
Gracias por compartirlo Mk!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar