15.03.2014, 23:31
|
|
Аспирант
|
|
Регистрация: 14.04.2010
Сообщений: 46
|
|
Чистка текста
Пишу надстройку над 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"
Алгоритм ниже в Чистка текста.
Последний раз редактировалось Roman Koff, 16.03.2014 в 01:39.
|
|
15.03.2014, 23:50
|
|
Кандидат Javascript-наук
|
|
Регистрация: 27.01.2012
Сообщений: 134
|
|
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>");
Последний раз редактировалось Zuenf, 16.03.2014 в 00:24.
Причина: Понял зачем 9 пункт, поправил
|
|
16.03.2014, 00:16
|
|
Аспирант
|
|
Регистрация: 14.04.2010
Сообщений: 46
|
|
Возможно неправильно сформулировал.
В тексте уже могут быть параграфы (<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:27.
|
|
16.03.2014, 00:33
|
|
Аспирант
|
|
Регистрация: 14.04.2010
Сообщений: 46
|
|
Zuenf,
s = s.replace(/\s*\n\s*/g, '</p>\n\n<p>').replace(/(\s(?!\n|\S))+/g, ' ');
это уже очень близко, но не то.
Всегда преклонялся перед людьми умеющими разговаривать с автоматами
|
|
16.03.2014, 00:34
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Что-то подобное я видел в Live street движке. Но там вроде на сервере реализация.
__________________
В личку только с интересными предложениями
|
|
16.03.2014, 00:51
|
|
Кандидат Javascript-наук
|
|
Регистрация: 27.01.2012
Сообщений: 134
|
|
Теперь вроде нормально.
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>');
Последний раз редактировалось Zuenf, 16.03.2014 в 01:10.
Причина: Теперь вроде нормально.
|
|
16.03.2014, 01:00
|
|
Аспирант
|
|
Регистрация: 14.04.2010
Сообщений: 46
|
|
Zuenf,
Гениально! Но не продакшн. Если несколько раз прогнать, то теперь <p></p> -- плодиться.
Принцип понял, спасибо. Дальше могу сам, если не интересно...
danik.js,
Серверная фильтрация есть, но она менее жесткая. Это действие должно делаться выборочно и вручную пользователем (редактором).
Последний раз редактировалось Roman Koff, 16.03.2014 в 01:05.
Причина: Если несколько раз прогнать, то теперь <p></p> -- плодиться.
|
|
16.03.2014, 01:03
|
|
Кандидат Javascript-наук
|
|
Регистрация: 27.01.2012
Сообщений: 134
|
|
Сообщение от Roman Koff
|
Zuenf,
ПС: не понял про function rep(test). Это баг или фича?
|
Сначала начал по другому делать, забыл убрать.
Последний раз редактировалось Zuenf, 16.03.2014 в 01:05.
|
|
16.03.2014, 01:22
|
|
Аспирант
|
|
Регистрация: 14.04.2010
Сообщений: 46
|
|
Я понял свою ошибку. Я не правильно алгоритм составил.
Нужно:
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 вариант.
Последний раз редактировалось Roman Koff, 16.03.2014 в 01:32.
|
|
16.03.2014, 01:39
|
|
Кандидат Javascript-наук
|
|
Регистрация: 27.01.2012
Сообщений: 134
|
|
Оп:
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>');
Последний раз редактировалось Zuenf, 16.03.2014 в 01:42.
|
|
|
|