#php #javascript #regex #json #jsonp
#php #javascript #регулярное выражение #json #jsonp
Вопрос:
Хоть убей, я не могу понять, как удалить это странное форматирование. Это то, что отправляется мне после JSON.stringify(someObj)
:http://jsbin.com/ohoto5/2/edit
Нажмите предварительный просмотр, и вы увидите форматирование. Мне нужно, чтобы это была одна строка, чтобы ее можно было включить в ответ JSONP (т. Е. jsonp12345(...)
). Если это несколько строк, это вызовет синтаксическую ошибку. Я перепробовал все комбинации регулярных выражений, какие только смог придумать, и ничто не удаляет строки. Даже /[rnst]/gi
нет. Единственное, что, кажется, удаляет это: /[wn]/gi
однако проблема в том, что я теряю все слова!
Любая помощь? Пожалуйста, никаких исправлений jQuery… Мне нужен чистый JavaScript.
Вот объект в Chrome (рис.):
Комментарии:
1. как вы получаете данные? используете ли вы php? или просто вызовом ajax
2. Данные будут отправлены через POST-запрос из iframe после вызова JSON.stringify() для объекта
3. О, и PHP хранит данные в MySQL, так что, я думаю, если в PHP есть исправление, это тоже сработало бы
4. Вы пробовали использовать
JSON.stringify(someObj).charCodeAt(index_of_weird_line_break)
, чтобы увидеть, что это за символ? Это может быть какая-то странная вещь в Юникоде, если регулярное выражение для всех пробелов не соответствует ему.5. покажите нам объект, который вы строите
Ответ №1:
Мне кажется, что это должно сработать:
s.replace(/[rn]/g, '')
Кажется, что каждый ненужный разрыв строки удален.
Комментарии:
1. Я нажал «выполнить», но вот что я вижу: skitch.com/oscargodson/fy4u7 / … — другими словами, кажется, что строки все еще там
2. @Oscar Но разве эти строки не являются важной частью самого контента?
3. Содержимое внутри <p> и <address>, в которых есть n или r, будет преобразовано в <br>s . Что касается разрывов строк, окружающих HTML, мне нужно их удалить, иначе это выдаст синтаксическую ошибку.
4. Я внес несколько корректировок. На самом деле там нет разрывов строк, они просто были там из-за HTML (
<p>
естьdisplay: block;
). Проверьте это: jsfiddle.net/axL7H/15. Но приведенный выше код в моей ссылке JSBin напрямую скопирован из моей базы данных MySQL, поэтому в нем не будет никаких стилей, и этот HTML внутри JSON никогда не попадает в DOM.
Ответ №2:
Сложно сказать, что необходимо, однако существует много различий между тем, что браузеры распознают как пробел, рассмотрите возможность точной настройки символов, которые вы хотите сопоставить, например
// List of characters matched as white space
var whiteSpace = 'u0009u000au000bu000cu000du0020u00a0'
'u1680u180eu2000u2001u2002u2003u2004'
'u2005u2006u2007u2008u2009u200au200b'
'u2028u2029u202fu205fu3000';
var re = new RegExp('[' whiteSpace '] ', 'g');
var x = 'lots and lots of space ';
alert(x.replace(re, ' ').replace(/ /,' '));
Комментарии:
1. Хм, может быть, я делаю это неправильно? похоже, это не работает: jsbin.com/ohoto5/4/edit
Ответ №3:
Отказавшись от регулярных выражений JS, я попробовал PHP и получил его с первой попытки:
preg_replace('/ss /', ' ', $referrer['cache'])
где кэш — это JSON в моей оригинальной ссылке JSBin выше. Теперь он возвращает:
callback([{"LatLng":{"Ba":45.531124,"Ca":-122.68374699999998},"InfoWindow":" <address>1125 NW 12th Ave, Portland, OR</address> <p>My first apartment</p> ","originalAddress":"1125 NW 12th Ave, Portland, OR"},{"LatLng":{"Ba":45.5138621,"Ca":-122.67767300000003},"InfoWindow":" <address>1330 SW 3rd Ave, Portland, OR</address> <p>My 2nd apartment</p> ","originalAddress":"1330 SW 3rd Ave, Portland, OR"},{"LatLng":{"Ba":45.748955,"Ca":-122.47959000000003},"InfoWindow":" <address>17501 NE 188th Ct, Brush Prairie, WA</address> <p>The first place I lived by my own</p> ","originalAddress":"17501 NE 188th Ct, Brush Prairie, WA"},{"LatLng":{"Ba":45.756944,"Ca":-122.43575800000002},"InfoWindow":" <address>18607 NE Erickson Rd, Brush Prairie, WA</address> <p>Last place I lived with my parents</p> ","originalAddress":"18607 NE Erickson Rd, Brush Prairie, WA"}])
Забавно, что точно такое же регулярное выражение в JS не дает такого же результата -_-
Ответ №4:
CRLF кодируется как r n, поэтому
str = str.replace(/(rn)/g, '');
должно выполнить эту работу.
Комментарии:
1. На самом деле, это заменит только разрывы строк в стиле Windows. Используйте
str.replace(/[rn]/g, '');
для замены их всех (квадратные скобки вместо круглых).