w3school preg_match_all preg_match preg_grep pattern ejemplos php crash preg-match

preg_match_all - Se bloquea PHP en preg_replace



preg_match() (5)

Ejecuté el siguiente script usando php.exe :

preg_replace(''#(?:^[^/pL]*)|(?:[^/pL]*$)#u'','''',$string);

o su equivalente:

preg_replace(''#(?:^[^/pL]*|[^/pL]*$)#u'','''',$string);

Si $string="S" o $string=" ذذ " funciona, si string=''ذ'' da como resultado que es incorrecto, y si string=''ذذ'' PHP se cuelga.

Pero funciona en las versiones 4.4.0 - 4.4.9, 5.0.5 - 5.1.6.

Qué está mal ?

Ver : http://3v4l.org/T3rpV

<?php $string=''دد''; echo preg_replace(''#(?:^[^/pL]*)|(?:[^/pL]*$)#u'','''',$string);

Salida para 5.4.0 - 5.5.0alpha6

Process exited with code 139.

Salida para 5.2.0 - 5.3.22, 5.5.0beta1

Salida para 4.4.0 - 4.4.9, 5.0.5 - 5.1.6

دد

Salida para 4.3.11, 5.0.0 - 5.0.4

Warning: preg_replace(): Compilation failed: PCRE does not support /L, /l, /N, /P, /p, /U, /u, or /X at offset 7 in /in/T3rpV on line 3

Salida para 4.3.0 - 4.3.10

Warning: Compilation failed: PCRE does not support /L, /l, /N, /P, /p, /U, /u, or /X at offset 7 in /in/T3rpV on line 3


Puede usar la función alternativa mb_ereg_replace ():

mb_internal_encoding("UTF-8"); mb_regex_encoding("UTF-8"); echo mb_ereg_replace(''#(?:^[^/pL]*)|(?:[^/pL]*$)#u'','''',$string);



Al mirar la expresión en sí, hay dos cosas que se podrían mejorar:

  1. Los * multiplicadores no son muy útiles; ¿Por qué querrías reemplazar una coincidencia potencialmente vacía con una cadena vacía? De hecho, ejecutar esto en mi sistema produce NULL desde la operación preg_replace() .

  2. Los grupos de memoria se pueden combinar juntos.

Este es el código después de aplicar ambas mejoras:

$string = ''ﺫﺫ''; var_dump(preg_replace(''#(?:^[^/pL]+|[^/pL]+$)#u'', '''', $string)); // string(4) "ﺫﺫ"

3v4l resultados

Si solo está buscando una función de recorte multibyte (compatible con 4.3.0 en adelante):

$string='' دد''; var_dump(preg_replace(''#(?:^/s+|/s+$)#u'', '''', $string));

3v4l resultados


Usa preg_quote y debes escapar correctamente del carácter especial antes de usarlo con tu expresión regular. Por ejemplo:

<?php $string = preg_quote("/دد"); echo preg_replace(''#(?:^[^/pL]*)|(?:[^/pL]*$)#u'','''',$string);

Véalo en acción: http://3v4l.org/LeBXg

Más sobre preg_quote .

Aclamaciones,

Ardy


Por último, el error fue resuelto:

Output for 4.4.0 - 4.4.9, 5.0.5 - 5.1.6, 5.5.27 - 5.5.33, 5.6.11 - 7.0.4, hhvm-3.6.1 - 3.12.0 دد