Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Чистка текста (https://javascript.ru/forum/misc/45770-chistka-teksta.html)

Roman Koff 15.03.2014 23:31

Чистка текста
 
Пишу надстройку над CodeMirror для редактирования html-кода. Совсем не силен в регулярных выражениях, подскажите, пожалуйста, как можно закодить следующий алгоритм –

Имеется текст в переменной s.
var s = cm.getSelection();

Нужно:
1. Добавить в начало "<p>"
2. Добавить в конец "</p>"
3. "\n" заменить на "</p><p>"
4. Заменить все пробельные символы на пробел
5. Удалить все двойные пробелы
6. Удалить все пробелы между "</p>" и "<p>"
7. Удалить пробелы до "</p><p>"
8. Удалить пробелы после "</p><p>"
9. После "</p>" вставить "\n\n"


Алгоритм ниже в http://javascript.ru/forum/misc/4577...-teksta.html#9.

Zuenf 15.03.2014 23:50

var s = 'test\n   kuku kuku  kuku     kukuk  \n test   ';
s = s.replace(/\s*\n\s*/g, '</p>\n\n<p>').replace(/(\s(?!\n|\S))+/g, '');
alert("<p>"+s+"</p>");

Roman Koff 16.03.2014 00:16

Возможно неправильно сформулировал.

В тексте уже могут быть параграфы (<p>text</p>). Нужно все переводы строк заменить на параграфы исключая дублирование и вложенность. При этом нужно пофиксить лишние пробельные символы и оформить параграфы отступом друг от друга.

Пункт 9 -- имеется в виду: После всех "</p>" вставить "\n\n"

Пример исходного текста может быть такой:
var s = "   \t\t   \t\t  Принцип восприятия   \t\t  \t \t   \t\t\t непредвзято создает паллиативный интеллект, условно.  \t   \n Концепция ментально оспособляет закон внешнего мира. Сомнение раскладывает на элементы неоднозначный структурализм. \n \n \n\nСмысл жизни профанирует принцип восприятия, отрицая очевидное. <p>Жизнь философски ассоциирует напряженный постмодернизм.</p>   <p> Объект деятельности означает конфликт. Согласно предыдущему, конфликт, в рамках сегодняшних воззрений, ясен не всем.</p> \n\nИсточник: http://www.artlebedev.ru/kovodstvo/sections/66/";

На выходе хочется получить вот это:
<p>Принцип восприятия непредвзято создает паллиативный интеллект, условно.</p>

<p>Концепция ментально оспособляет закон внешнего мира. Сомнение раскладывает на элементы неоднозначный структурализм.</p>

<p>Смысл жизни профанирует принцип восприятия, отрицая очевидное. Жизнь философски ассоциирует напряженный постмодернизм.</p>

<p>Объект деятельности означает конфликт. Согласно предыдущему, конфликт, в рамках сегодняшних воззрений, ясен не всем.</p>

<p>Источник: http://www.artlebedev.ru/kovodstvo/sections/66/</p>



Пример хороший. Спасибо.

Roman Koff 16.03.2014 00:33

Zuenf,
s = s.replace(/\s*\n\s*/g, '</p>\n\n<p>').replace(/(\s(?!\n|\S))+/g, ' ');
это уже очень близко, но не то.

Всегда преклонялся перед людьми умеющими разговаривать с автоматами ;)

danik.js 16.03.2014 00:34

Что-то подобное я видел в Live street движке. Но там вроде на сервере реализация.

Zuenf 16.03.2014 00:51

Теперь вроде нормально.
var s = "   \t\t   \t\t  Принцип восприятия   \t\t  \t \t   \t\t\t непредвзято создает паллиативный интеллект, условно.  \t   \n Концепция ментально оспособляет закон внешнего мира. Сомнение раскладывает на элементы неоднозначный структурализм. \n \n \n\nСмысл жизни профанирует принцип восприятия, отрицая очевидное. <p>Жизнь философски ассоциирует напряженный постмодернизм.</p>   <p> Объект деятельности означает конфликт. Согласно предыдущему, конфликт, в рамках сегодняшних воззрений, ясен не всем.</p> \n\nИсточник: http://www.artlebedev.ru/kovodstvo/sections/66/";

s = s.replace(/(<\/p>|)\s*\n\s*|<p>/g, '</p><p>').replace(/\s+/g, ' ').replace(/<\/p>.*?<p>/g, '</p>\n\n<p>');

alert('<p>'+s+'</p>');

Roman Koff 16.03.2014 01:00

Zuenf,
Гениально! Но не продакшн. Если несколько раз прогнать, то теперь <p></p> -- плодиться.

Принцип понял, спасибо. Дальше могу сам, если не интересно...

danik.js,
Серверная фильтрация есть, но она менее жесткая. Это действие должно делаться выборочно и вручную пользователем (редактором).

Zuenf 16.03.2014 01:03

Цитата:

Сообщение от Roman Koff (Сообщение 302693)
Zuenf,
ПС: не понял про function rep(test). Это баг или фича? ;)

Сначала начал по другому делать, забыл убрать.

Roman Koff 16.03.2014 01:22

Я понял свою ошибку. Я не правильно алгоритм составил.

Нужно:
1.	Заменить "</p>" и "<p>" на "\n"
2.	Добавить в начало и конец "\n"
3.	Заменить "\n" на "</p><p>"
4.	Заменить все пробельные символы на пробел
5.	Удалить все двойные пробелы
6.	Заменить "</p> <p>" на "</p><p>"
7.	Заменить " </p>" на "</p>"
8.	Заменить "<p> " на "<p>"
9.	Заменить все "</p><p></p><p>" на "</p><p>"
10.	Удалить "</p>" в начале (если есть)
11.	Удалить "<p>" в конце (если есть)
12.	Заменить "</p>" на "</p>\n\n"

Есть альтернативный вариант:
1.	Заменить "</p>" и "<p>" на "\n"
2.	Заменить все пробельные символы за исключением "\n" на пробел
3.	Удалить все двойные пробелы
4.	Получить массив строк по разделителю "\n" исключая пустые (пробельные) строки
5.	Объединить массив в строку используя соединитель "</p>\n\n<p>"
6.	Добавить в начало "<p>" и в конец "</p>"


Не знаю, что на JS будет оптимальнее. На C# делал бы 2 вариант.

Zuenf 16.03.2014 01:39

Оп:
var s = "   \t\t   \t\t  Принцип восприятия   \t\t  \t \t   \t\t\t непредвзято создает паллиативный интеллект, условно.  \t   \n Концепция ментально оспособляет закон внешнего мира. Сомнение раскладывает на элементы неоднозначный структурализм. \n \n \n\nСмысл жизни профанирует принцип восприятия, отрицая очевидное. <p>Жизнь философски ассоциирует напряженный постмодернизм.</p>   <p> Объект деятельности означает конфликт. Согласно предыдущему, конфликт, в рамках сегодняшних воззрений, ясен не всем.</p> \n\nИсточник: http://www.artlebedev.ru/kovodstvo/sections/66/";

s = s.replace(/[\t ]+/g, ' ')
     .replace(/<\/p>|<p>/g, '\n')
     .replace(/\s*\n\s*/g,'</p>\n\n<p>');
//повтор для проверки
s = s.replace(/[\t ]+/g, ' ')
     .replace(/<\/p>|<p>/g, '\n')
     .replace(/\s*\n\s*/g,'</p>\n\n<p>');

alert('<p>'+s+'</p>');


Часовой пояс GMT +3, время: 10:14.