Удалите эти разрывы строк с помощью JavaScript

#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, '')
  

Демонстрация jsFiddle

Кажется, что каждый ненужный разрыв строки удален.

Комментарии:

1. Я нажал «выполнить», но вот что я вижу: skitch.com/oscargodson/fy4u7 / … — другими словами, кажется, что строки все еще там

2. @Oscar Но разве эти строки не являются важной частью самого контента?

3. Содержимое внутри <p> и <address>, в которых есть n или r, будет преобразовано в <br>s . Что касается разрывов строк, окружающих HTML, мне нужно их удалить, иначе это выдаст синтаксическую ошибку.

4. Я внес несколько корректировок. На самом деле там нет разрывов строк, они просто были там из-за HTML ( <p> есть display: block; ). Проверьте это: jsfiddle.net/axL7H/1

5. Но приведенный выше код в моей ссылке 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, ''); для замены их всех (квадратные скобки вместо круглых).