2011-06-07 34 views
48

Estoy escribiendo un código JavaScript que utiliza una cadena procesada con PHP. ¿Cómo puedo escapar de comillas simples (y solo comillas simples) en mi cadena PHP?¿Cómo se escapan solo las comillas simples?

<script type="text/javascript"> 
    $('#myElement').html('say hello to <?php echo $mystringWithSingleQuotes ?>'); 
</script> 
+8

Deberá escapar más de comillas simples. Newlines, por ejemplo. Puede que le vaya bien con algo como 'addcslashes ($ mystringWithSingleQuotes," '\ "\ r \ n \\\ t \ 0 .. \ 37") ' –

+2

En lugar de manejar el escape usted mismo, use' json_encode() 'para obtener una cadena de Javascript válida (y elimine las comillas simples externas). – mario

+1

@Frank: ¿Puede publicar su respuesta como respuesta en lugar de como comentario? No se pueden seleccionar las respuestas adecuadas en los comentarios y, por lo tanto, crea preguntas falsas "sin respuesta". – Sylverdrag

Respuesta

49

En pocas palabras: echo str_replace('\'', '\\\'', $myString); Sin embargo, me gustaría sugerir el uso de JSON y json_encode() función, ya que será más confiable (comillas nuevas líneas por ejemplo):

<?php $data = array('myString' => '...'); ?> 

<script> 
    var phpData = <?php echo json_encode($data) ?>; 
    alert(phpData.myString); 
</script> 
+1

Gracias .. Lo sabía pero estaba enfrentando un problema porque estaba tratando de hacer 'JSON.parse (' '); 'y estaba fallando porque había una sola cita dentro de los datos. Más tarde llegué a saber que no hay necesidad de usar' JSON.parse' aquí. –

+4

Todas las respuestas que dicen 'str_replace (' ') '"," \\' ", $ string)' y simi Lar son incorrectos. Considere la cadena \ 'Se reemplazará con \\' y esto causará una vulnerabilidad de inyección. En su lugar, use json_encode como sugiere Crozin. –

+0

json_encode podría causar problemas si no se instaló la extensión json. Lea mi solución a continuación usando strtr (..) –

16
str_replace("'", "\'", $mystringWithSingleQuotes); 
9

reemplazar sólo comillas simples, utilice esta declaración simple:

$string = str_replace("'","\\'", $string); 
+0

Wow esto resolvió mi problema con respecto a mgic_qoute – AlexJaa

+0

obtengo de Android "# 039" no es correcto – delive

0

No estoy seguro de qué está haciendo exactamente con sus datos, pero siempre puede intentar:

$ string = str_replace ("'", "% 27", $ string);

Lo uso cuando las cadenas se envían a una base de datos para su almacenamiento. % 27 es la codificación del carácter 'y también ayuda a evitar la interrupción de las solicitudes GET si hay un solo carácter' contenido en una cadena enviada a su servidor. Reemplazaría 'con% 27 tanto en JavaScript como en PHP, solo en caso de que alguien intente enviar manualmente algunos datos a su función de PHP. Para hacerlo más bonito para su usuario final, simplemente ejecute una función de reemplazo inverso para todos los datos que obtenga de su servidor y reemplace todas las subcadenas% 27 con '.

Happy injection avoid!

0

Así es como lo hice. Tonto, pero simple

$singlequote = "'"; 
$picturefile = getProductPicture($id); 

echo showPicture('.$singlequote.$picturefile.$singlequote.'); 

yo estaba trabajando en la salida HTML que llama código JavaScript para mostrar una imagen ...

1

Después de una lucha con este problema mucho tiempo, creo que han encontrado la mejor solución.

Combina dos funciones que hacen posible escapar de una cadena para usar como HTML.

Dos comillas dobles para escapar si utiliza la cadena dentro de una llamada a la función javascript, y otras para evitar la comilla simple para evitar las comillas simples que rodean el argumento.

Solución:

mysql_real_escape_string(htmlspecialchars($string)) 

Resuelve:

  • un php creado para llamar a una función javascript como

eco 'onclick = "javascript_f unción(\''.mysql_real_escape_string (htmlspecialchars ($ cadena))"

9

En algunos casos, sólo convertirlo en ENTIDADES:

      //i.e. $x= ABC\DEFGH'IJKL 
$x= str_ireplace("'", "&apos;", $x); 
$x= str_ireplace("\\", "&bsol;", $x); 
$x= str_ireplace('"', "&quot;", $x); 

en la página HTML, salida visual es el mismo:

ABC\DEFGH'IJKL 
embargo

, se esteriliza en la fuente.

0

Escribí la siguiente función. Reemplaza lo siguiente:

Cita Individual [ '] con tala y comilla simple [\']

barra invertida [\] con dos barras invertidas [\\]

function escapePhpString($target) { 
    $replacements = array(
      "'" => '\\\'', 
      "\\" => '\\\\' 
    ); 
    return strtr($target, $replacements); 
} 

se puede modificar para añadir o eliminar las sustituciones de caracteres en la matriz $ replacements. Por ejemplo, para reemplazar \ r \ n se convierte en "\ r \ n" => "\ r \ n" y "\ n" => "\ n".

/** 
* With new line replacements too 
*/ 
function escapePhpString($target) { 
    $replacements = array(
      "'" => '\\\'', 
      "\\" => '\\\\', 
      "\r\n" => "\\r\\n", 
      "\n" => "\\n" 
    ); 
    return strtr($target, $replacements); 
} 

La buena característica de strtr es que preferirá reemplazos largos. Ejemplo, "Cool \ r \ nFeature" escapará \ r \ n en lugar de escaparse \ n a lo largo.

6

Si quieres escapar de caracteres con un \ tiene addcslashes() por ejemplo, si quieres escapar sólo comillas simples como la pregunta que se pueden hacer:

echo addcslashes($value, "'"); 

Y si quieres escapar ', ", \ y nul (el byte nulo) se puede utilizar addslashes():

echo addslashes($value); 
+1

Gracias por señalar [addcslashes] (http://php.net/manual/en/function.addcslashes.php) para escapar de los caracteres arbitrarios. –

0

sé que llego tarde a la fiesta. Pero puede utilizar la función addcslashes para hacer esto como así,

echo addcslashes($text, "'\\"); 
Cuestiones relacionadas