Me gusta reemplazar las letras "KELLY" entre "#" con la misma longitud de "#". (aquí, cinco números repetitivos en lugar de 'KELLY')
$str = "####KELLY#####"; // any alpabet letters can come. preg_replace('/(#{3,})[AZ]+(#{3,})/', "$1$2", $str); Devuelve ######### (cuatro hashes y luego cinco hashes) sin 'KELLY'.
¿Cómo puedo obtener ############## , que son cuatro hashes principales originales, luego reemplazar cada letra con un hash, luego los cinco hashes finales originales?
El metacarácter \G continue crea un patrón más desordenado, pero permite la capacidad de usar preg_replace() en lugar de preg_replace_callback() .
Efectivamente, busca los tres o más hashes principales, luego realiza reemplazos de una sola letra hasta que llega a la secuencia final de tres o más hashes.
Esta técnica también permite que los marcadores hash se "compartan"; en realidad, no sé si esto es algo que se desea.
Código: ( Demostración )
$str = "####KELLY##### and ###ANOTHER###### not ####foo#### but: ###SHARE###MIDDLE###HASHES### ?"; echo $str . "\n"; echo preg_replace('/(?:#{3}|\G(?!^))\K[AZ](?=[AZ]*#{3})/', '#', $str);Producción:
####KELLY##### and ###ANOTHER###### not ####foo#### but: ###SHARE###MIDDLE###HASHES### ? ############## and ################ not ####foo#### but: ############################# ?Desglose:
/ #starting pattern delimiter (?: #start non-capturing group #{3} #match three hash symbols | # OR \G(?!^) #continue matching, disallow matching from the start of string ) #close non-capturing group \K #forget any characters matched up to this point [AZ] #match a single letter (?= #lookahead (do not consume any characters) for... [AZ]* #zero or more letters then #{3} #three or more hash symbols ) #close the lookahead / #ending pattern delimiter O puede lograr el mismo resultado con preg_replace_callback() .
Código: ( Demostración )
echo preg_replace_callback( '/#{3}\K[AZ]+(?=#{3})/', function($m) { return str_repeat('#', strlen($m[0])); }, $str );Resolví el problema con la función preg_replace_callback en php. Gracias CBroe por los consejos.
preg_replace_callback('/#{3,}([AZ]+)#{3,}/i', 'replaceLetters', $str); function replaceLetters($matches) { $ret = ''; for($i=0; $i < strlen($matches[0]); $i++) { $ret .= "#"; } return $ret; }