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);
tal vez esto ayude :
estas propiedades generalmente solo están disponibles si PCRE está compilado con "--enable-unicode-properties"
http://docs.php.net/manual/en/regexp.reference.unicode.php#96479
Al mirar la expresión en sí, hay dos cosas que se podrían mejorar:
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 produceNULL
desde la operaciónpreg_replace()
.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) "ﺫﺫ"
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));
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 دد