borrame.com - Colección particular de recortes de código y documentación para programación web

Canales RSS

Lo más fresco

  1. Bookmarklets Nuevo
  2. Recetario básico para CakePHP/2 Nuevo
  3. Certificado auto-firmado Nuevo

Sugerencias del chef

Lo más visitado

  1. Fecha y hora
  2. Dar formato a un número
  3. Reiniciar secuencia
  4. Vaciar un esquema
  5. Certificado auto-firmado
Compartir esta página

escapeshellarg() multiplataforma

La función escapeshellarg() sólo funciona correctamente en Linux/Unix. En Windows puede dañar los parámetros que recibe ya que a veces se dedica a eliminar caracteres en lugar de codificarlos. La siguiente función afronta la tarea con (esperemos) más acierto:

/** * Versión de escapeshellarg() que funciona también en Windows * * @param string $arg Argumento para la línea de comandos * @return string * * @version 2014-05-21 */ function escape_shell_arg($arg){     if( PHP_SHLIB_SUFFIX==='dll' && $arg!=='' ){         $salida = '';         foreach( preg_split('/([%"])/ui', $arg, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) as $fragmento){             if( $fragmento==='"' ){                 $salida .= '\\"';             }elseif( $fragmento==='%' ){                 $salida .= '^%';             }else{                 $salida .= escapeshellarg($fragmento);             }         }         return $salida;     }else{         return escapeshellarg($arg);     } }

Ejemplos

Original
Completado el 90% del total ("OK")
Función nativa
"Completado el 90 del total ( OK )"
Función propia
""Completado el 90"^%" del total ("\""OK"\"")"

Podemos determinar si el resultado es correcto comparando la cadena original con la recibida por el comando ejecutado. P.ej.:

<?php // comando.php if($argc>0){     echo $argv[1]; }
<?php // prueba.php // [...] $original = 'Completado el 90% del total ("OK")'; $comando = 'php comando.php ' . escape_shell_arg($original); $recibido = `$comando`; echo $original===$recibido ? 'OK' : 'ERROR';
C:\>php prueba.php OK

En particular, probar estas cosas con el comando echo de Windows no suele salir bien.

Referencias

Esta página ha sido impresa el sábado 23 de septiembre de 2017 (02:22:13 +0200) desde http://borrame.com/recortes/php/escape-shell-arg.html. La última vez que miré contenía HTML válido con CSS fresquito y si tiene flatas de ortografía ha sido sin querer.

borrame.com es el sitio anteriormente conocido como bits.demogracia.com (no confundir con Demogracia, que sólo pasaba por ahí).

© 2005-2017 by Álvaro González (alvaro.es) • Burgos (España) • borrame.com