responseText contiene caracteres adicionales de espacio en blanco (líneas nuevas, líneas de alimentación), cómo prevenirlos y eliminarlos.

Tengo un script ajax que llama a un archivo php.

El archivo php echos “sí” o “no”, quiero usar las cadenas para hacer comparaciones lógicas.

En el javascript, quiero comparar la cadena en el texto de respuesta para ver si es == a “sí” (o “no”). Pero la comparación falla.

Así que hago el texto de respuesta de alerta, y muestra “sí” (o “no”) como la cadena. Pero leí aquí que el texto de respuesta podría contener caracteres ocultos de espacios en blanco, así que hice la longitud de la cadena de texto de respuesta y muestra que la longitud de la cadena es 4 caracteres más larga de lo que debería ser. Así que escapé de la alerta responseText (escape (responseText)) y muestra que tengo% 0A y% 0D (líneas nuevas y líneas de alimentación) ocultos al final de la cadena de texto de respuesta.

Leí que estos caracteres están agregados por php, pero también he leído que los caracteres adicionales son diferentes entre las diferentes versiones / servidores de php.

¿Cómo evitar estos espacios en blanco adicionales sin usar expresiones regulares, ya que la expresión regular podría eliminar los espacios en blanco intencionales?

Por favor, no sugiera usar jquery o mootools como respuestas.

TIA

Leí que estos caracteres están agregados por php, pero también he leído que los caracteres adicionales son diferentes entre las diferentes versiones / servidores de php.

Eso está mal. Eso es simple de verificar: cree un archivo test.php, escriba esto y solo esto: (sin ?> ) en él y ejecutarlo. No habrá espacios en blanco.

Estos espacios en blanco muy probablemente provengan de sus scripts. Un error común es dejar algunas líneas nuevas después de cerrar las tags php ( ?> ), Lo que da como resultado la impresión de una nueva línea.

Verifique que todos los archivos incluidos antes o después de hacer echo "yes"; no hace eco de nada y no tiene una línea nueva posterior a ?> .

La forma más fácil de evitar este problema es no usar tags php close al final de los archivos (no son obligatorias).

Sé que usted preguntó acerca de hacer la comparación sin expresiones regulares, pero dadas las condiciones que mencionó anteriormente, esa será una forma muy rápida y efectiva de obtener su respuesta, y no necesariamente perturbará ningún otro procesamiento.

 var trimmedResponse = responseText.replace(/^\s*/,'').replace(/\s*$/,'').toLowerCase(); if (trimmedResponse == 'yes') { // do your 'yes' case } else if (trimmedResponse == 'no') { // do your 'no' case } else { // do your 'none of the above' case } 

Eso reducirá el espacio en blanco inicial, el espacio en blanco al final (incluido el combo CR / LF) y convertirá a minúsculas solo para comparar.

Creo que puedes ir por el camino equivocado. En lugar de intentar crear una respuesta de forma manual, ¿por qué no utilizas las matrices PHP como una estructura de datos y JSON para la entrega?

  $flag) $json = json_encode($arr); // See http://www.geekality.net/2010/06/27/php-how-to-easily-provide-json-and-jsonp/ // Set JSONP header header('content-type: application/json; charset=utf-8'); // Get callback from $_GET and prepend the JSON data echo isset($_GET['callback']) ? "{$_GET['callback']}($json)" : $json; 

¿Intentó utilizar la función trim () de PHP antes de enviar los datos?

Incluso si es posible controlar todas las secuencias de comandos PHP para evitar CRLF antes o después de la etiqueta php, esta no es una buena opción, ya que puede imaginar agregar unos pocos días, meses o años (¡sin querer!) Un CRLF en un archivo y esto afectará a otra parte de su sitio web.

De hecho, para evitar este problema, tiene dos opciones:

Opción 1 : Deje que php envíe los datos así con la basura al principio, y limpie los datos en Javascrpt con:

  response = http.responseText; response = response.replace(/[\n\r]+/g, ''); 

En este caso, esto significa que debe LIMPIAR TODO el CRLF (cambie la Regex para limpiar solo al principio si es necesario o para limpiar también los espacios)

La opción 2 (mejor, creo) es limpiar el buffer de salida de PHP inmediatamente antes de enviar los datos al navegador. Asi que:

  ... many code here ob_end_clean(); echo $data_for_the_browser;