Estoy investigando, pero no soy capaz de encontrar la solución a esto.
La idea es reemplazar los caracteres $_ de una cadena con otra cosa. Si elimina el signo de dólar de la variable $search , funciona (pero no de la manera deseable).
No funciona porque el signo de dólar es un carácter especial, pero no encuentro cómo evitarlo.
Esto es lo que tengo:
$search = '$_'; // replace to '_' OR '[$_]' it returs "$1" instead of "1" $replace = 1; $regex = '#".*?"(*SKIP)(*FAIL)|\b' . $search . '\b#s'; $fullInput = '"$_" $_'; $r = preg_replace([$regex], $replace, $fullInput); echo $r . PHP_EOL; // Output with current code : "$_" $_ // Output with '_' or '[$_]': "$_" $1 // // Expected result: "$_" 1A tener en cuenta, si el texto está entre comillas, no se debe reemplazar.
Puede usar esta expresión regular para la búsqueda:
"[^\\"]*(?:\\.|[^\\"]*)*"(*SKIP)(*F)|\$_ y reemplácelo con [$0]
Patrón antes | coincide con una cadena entre comillas dobles que permite una comilla escapada en el medio. Patrón después de | coincide con $_ .
Detalles RegEx:
"[^\\"]*(?:\\.|[^\\"]*)*" : Coincide con una cadena entre comillas dobles. Permitimos personajes escapados en este partido.(*SKIP)(*F) : Saltar y fallar este partido| : O\$_ : coincide con el texto literal $_Código:
$search = '$_'; $replace = '[$0]'; $regex = '/"[^\\"]*(?:\\.|[^\\"]*)*"(*SKIP)(*F)|' . preg_quote($search, '/') . '/'; $fullInput = '"$_" $_'; $r = preg_replace($regex, $replace, $fullInput); echo $r . PHP_EOL;Producción:
"$_" [$_]