Siento que esto seguramente debe ser un duplicado de una pregunta que se responde con frecuencia, pero no puedo encontrar una respuesta que aborde mi problema particular.

Estoy cargando datos de MySQL a través de PHP, incluidas algunas cadenas y una cadena codificada con JSON. Estos datos pueden contener caracteres especiales, ingresados por el usuario.

Luego combino estos datos en una matriz PHP, luego los json_encode y los leo en javascript usando JSON.parse.

Mi problema es que un apóstrofe en cualquiera de estas cadenas interrumpirá el javascript, evitando que se complete JSON.parse.

Creo que hay tres formas de resolver esto:

  1. Realice algún tipo de codificación en los datos ingresados por el usuario antes de que se guarden en la base de datos
  2. Escape los caracteres especiales cuando cargue desde MySQL (usando htmlspecialchars() o similar), aunque esto será difícil cuando cargue datos almacenados como una cadena JSON (supongo que podría decodificarlos, luego recorrerlos y escapar de caracteres especiales en cada elemento, luego vuelva a codificarlo).
  3. Escapar de los caracteres especiales en javascript, de alguna manera. Pero no sé cómo haría esto.

Debo decir que la codificación de caracteres especiales es probablemente el aspecto más frustrante del desarrollo web, ya que me causa muchos errores inesperados y me cuesta entender las diferentes funciones y cuándo deberían usarse.

EDITAR:

var feedback = JSON.parse('{"721103":[{"sessionid":"45","feedback":{"praise":["","",""],"development":["","",""]}},{"sessionid":"46","feedback":{"praise":["Test","Test's",""],"development":["","",""]}}') ;

El apóstrofe en Test's rompe el javascript

1
Rob 31 oct. 2017 a las 04:35

3 respuestas

La mejor respuesta

Mis intentos de editar la respuesta de @kmoser con la solución real que funcionó fueron rechazados en la revisión por pares, así que esto es lo que funcionó. Todo el crédito a @kmoser:

$json_feedback = preg_replace( preg_quote('/\u/'), '\\\\\\\\u', json_encode( $feedback, JSON_HEX_APOS | JSON_HEX_QUOT ) );

Funciona al reemplazar los singles y las comillas dobles con cadenas hexadecimales cuando los datos se recuperan de la base de datos MySQL. Por razones que no entiendo, eso todavía rompió el javascript, así que hice un preg_replace para poner una barra invertida adicional antes del código escapado.

Observe cuántas barras invertidas tuve que poner para persuadir a preg_replace para que coloque la barra invertida adicional para evitar que se rompa el javascript. Es posible que pueda salir con menos barras diagonales inversas, ¡el número que aparece aquí es principalmente por pura frustración con este tonto problema!

1
Rob 18 nov. 2017 a las 15:27

No manipule los datos del usuario antes de almacenarlos en la base de datos. Puedes juntarlo todo lo que quieras después de recuperarlo.

Supongo que está utilizando la función json_encode () de PHP para producir la función Cadena codificada con JSON, en cuyo caso puede usar la opción JSON_HEX_APOS para codificar apóstrofes como \u0027, por ejemplo:

json_encode( $a, JSON_HEX_APOS )

Donde $a es su matriz PHP. Esto debería producir una cadena JSON desprovista de apóstrofes reales, que puede rodear con apóstrofes para crear una cadena Javascript:

echo "var feedback = JSON.parse('" . json_encode( $a, JSON_HEX_APOS ) . "')";
1
kmoser 31 oct. 2017 a las 03:36

Esto debería evitar que su javascript se rompa:

var feedback = JSON.parse(`{"721103":[{"sessionid":"45","feedback":{"praise":["","",""],"development":["","",""]}},{"sessionid":"46","feedback":{"praise":["Test","Test's",""],"development":["","",""]}}]}`) ;

Utiliza ``, en lugar de ''. Funcionan igual, pero no se afectarán entre sí.

También corregí su error de sintaxis json.

2
31 oct. 2017 a las 01:52