Buscar y reemplazar cadena en Vim


1

Tengo un código similar a este:

$ POST _ ['%']

donde% es cualquier longitud de cualquier letra + cadena de números y quiero reemplazarlo con

mysql_real_escape_string($POST['%'])

hasta ahora he creado este comando pero no reconoce $ POST ['.'] como ninguna cadena.

:%s/$_POST['.']/mysql_escape_string($_POST['\=submatch(0)'])/gc

Respuestas:


2

Primero, su uso de \=submatch(0)es demasiado complejo, solo use \ 0. Y tenga en cuenta que la coincidencia secundaria 0 siempre es el patrón totalmente coincidente, por lo que su patrón de reemplazo tiene cierta redundancia. En segundo lugar, el .átomo solo coincide con un personaje. Y finalmente, necesitas escapar del []'s y el $. Intenta esto en su lugar:

:%s/\$_POST\['.\{-}'\]/mysql_escape_string(\0)/gc

El uso de \{-}medios para hacer coincidir cualquier número del átomo anterior, de una manera no codiciosa (en oposición a *).

También noto que sus ejemplos son inconsistentes entre sí. ¿Es " $POST_[...]", " $_POST[...]" o simplemente " $POST[...]"?

Es posible que desee echar un vistazo a un libro como Mastering Regular Expressions .


2

$, [y] son ​​metacaracteres en expresiones regulares. Prueba esto (no probado)

:%s/\$_POST\['.'\]/mysql_escape_string(\$_POST\['\=submatch(0)'\])/gc

[editar] Gracias @tink


Patrón no encontrado: $ _POST ['.']
James

En realidad ... $ también es un carácter especial, así que intente esto:% s / \ $ POST _ ['.'] / Mysql_escape_string ($ _ POST ['\ = submatch (0)']) / gc
tink

1
s /^\(.*\)$/ mysql_real_escape_string (\ 1) /

Parece hacer lo que quieres. Es simple ya que solo agrega texto alrededor de la cadena existente en lugar de reemplazar realmente las cosas dentro de ella.


No puedo reelaborar su publicación para simplemente reemplazar $ POST [''], el cajero automático solo reemplaza todas las líneas con 'mysql_real_escape_string (1)'
James

Intenté algo como esto:% s / $ POST ['^ (. *) $'] / Mysql_real_escape_string (\ 1) / g
James

Nuestros vim deben registrar los refref de manera diferente, entonces ... Si nada más, puede reemplazar ^ y $ en dos ejecuciones de reemplazo.
John

0

8 meses después y necesito esto nuevamente, así que pensé en proporcionar una solución ordenada:

sed 's/\$_GET\[\(.*\)\]/mysqli_real_escape_string(\$_GET\[\1\])/g' test.php
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.