responseText содержит дополнительные пробельные символы (новые строки, переводы строк), как их предотвратить и удалить? - PullRequest
2 голосов
/ 26 августа 2011

У меня есть сценарий ajax, который вызывает файл php.

Файл php выдает «да» или «нет», я хочу использовать строки для логического сравнения.

В javascript я хочу сравнить строку в responseText, чтобы увидетьесли это == для «да» (или «нет»).Но сравнение не удается.

Итак, я делаю текст responseText оповещения, и он показывает «да» (или «нет») в качестве строки.Но я прочитал здесь, что responseText может содержать скрытые пробельные символы, поэтому я сделал длину строки responseText, и она показывает, что длина строки на 4 символа больше, чем должна быть.Поэтому я избежал предупреждения responseText (escape (responseText)), и оно показывает, что у меня скрыты% 0A и% 0D (новые строки и переводы строк) в конце строки responseText.

Я прочитал, что эти символыдобавлен php, но я также читал, что дополнительные символы различаются в разных версиях / серверах php.

Как предотвратить эти лишние пробелы без использования регулярных выражений, поскольку регулярные выражения могут удалять намеренные пробельные символы?

Пожалуйста, не предлагайте использовать jquery или mootools в качестве ответов.

TIA

Ответы [ 5 ]

8 голосов
/ 27 августа 2011

Я читал, что эти символы добавляются php, но я также читал, что дополнительные символы различны для разных версий / серверов php.

Это неправильно. Это легко проверить: создайте файл test.php, запишите в нем только это: <?php echo "test"; (без ?>) и выполните его. Пробелов не будет.

Эти пробелы, скорее всего, происходят из ваших сценариев. Распространенная ошибка заключается в том, что после закрывающих тегов php (?>) остаются некоторые завершающие символы новой строки, что приводит к печати новой строки.

Убедитесь, что все файлы, включенные до или после выполнения echo "yes";, ничего не отражают и не имеют завершающего перевода строки после ?>.

Самый простой способ избежать этой проблемы - не использовать теги php close в конце файлов (они не являются обязательными).

1 голос
/ 27 августа 2011

Я думаю, вы, возможно, ошибаетесь.Вместо того, чтобы вручную пытаться создать ответ, почему вы не используете массивы PHP в качестве структуры данных и JSON для доставки?

<?php
$flag = false
if (condition){
  $flag = true;
}

$arr = array("is_true" => $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;
1 голос
/ 27 августа 2011

Я знаю, что вы спрашивали о проведении сравнения без регулярных выражений, но с учетом условий, которые вы упомянули выше, это будет очень быстрый и эффективный способ получить ваш ответ и не обязательно нарушит любую другую обработку.

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
}

Это обрезает начальные пробелы, конечные пробелы (включая комбо CR / LF) и преобразуется в нижний регистр только для сравнения.

0 голосов
/ 16 января 2018

Даже если можно позаботиться обо всех скриптах PHP, чтобы избежать CRLF до или после тега php, это не очень хороший вариант, так как вы можете представить добавление через несколько дней, месяцев или лет (без необходимости!) CRLF в файл, и это повлияет на другую часть вашего веб-сайта.

На самом деле, чтобы избежать этой проблемы, у вас есть два варианта:

Опция 1 : разрешить php отправлять данные с мусором в начале и очищать данные в Javascrpt с помощью:

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

В этом случае это означает, что вы очищаете ВСЕ CRLF (измените регулярное выражение, чтобы очищать только в начале, если это необходимо, или для очистки также пробелов)

Вариант 2 (лучше, я думаю) - очистить выходной буфер PHP непосредственно перед отправкой данных в браузер. Итак:

 ... many code here
 ob_end_clean();
 echo $data_for_the_browser;
0 голосов
/ 26 августа 2011

Пробовали ли вы использовать функцию PHP trim () перед отправкой данных?

...