Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как упростить цепь регулярных выражений (https://javascript.ru/forum/misc/41982-kak-uprostit-cep-regulyarnykh-vyrazhenijj.html)

mi.rafaylik 08.10.2013 10:57

Как упростить цепь регулярных выражений
 
Прошу совета - стоит ли сокращать количество прохождений регулярок в тексте, или такая конструкция допустима?
P.S. 1: Операции выполняются с помощью jQuery, но думаю тема регулярных выражений в этом разделе будет актуальней.
P.S. 2: Данная функция замены выполняется только в том случае, когда нужно скопировать содержимое div в textarea, для просмотра и точной коррекции.
<div id='test' contenteditable="true"><p>Paragraph 1</p><p>Paragraph 2</p><p></p><div>Div</div><div>&nbsp;&nbsp;</div></div>
<teatarea id='correction'></textarea>
<div id='copy'></div>

$('#copy').click(function(){
	$('#correction').val($('#test').html()
		.replace(/<div>/g, '<p>') // заменяем блоки на параграфы
		.replace(/<\/div>/g, '</p>')
		.replace(/&nbsp;/g, '') // удаляем неразрывные пробелы
		.replace(/<p><\/p>/g, '') // удаляем пустые параграфы
		.replace(/<\/p><p>/g, '</p>\r\n\r\n<p>') // добавляем переносы строк после параграфов для лучшей читаемости
	);
});

Сложность в том, что текст перебирается пять раз.
Можно было бы выполнить несколько однотипных действий сразу, например
.replace(/&nbsp;|<p><\/p>/g, '')

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

ksa 08.10.2013 11:06

Цитата:

Сообщение от mi.rafaylik
добавляем переносы строк после параграфов для лучше читаемости

Т.е. ЦССа у тебя нет принципиально? :D

danik.js 08.10.2013 11:11

Цитата:

Сообщение от mi.rafaylik
Прошу совета

Тебе другой совет: не занимайся ерундой )
А если ты не считаеть написанное выше ерундой - то лучше вообще не занимайся программированием :)

ksa 08.10.2013 11:14

Предложу такой вариант...

var re = /(&nbsp;)|(<div>(&nbsp;)*<\/div>)|(<p>(&nbsp;)*<\/p>)/g;
var str = "<div id='test'><p>Paragraph 1</p><p>Paragraph 2</p><p></p><div>Div</div><div>&nbsp;&nbsp;</div></div>";
alert(str.replace(re, ''));

P.S.
Но ерундой таки лучше не заниматься. :yes:

danik.js 08.10.2013 11:27

Цитата:

Сообщение от mi.rafaylik
// добавляем переносы строк после параграфов для лучше читаемости

Читаемости кем? Браузером? Или это на стороне сервера все происходит?

mi.rafaylik 08.10.2013 11:45

ksa, danik.js, естественно, что для вида на странице используется CSS, я неправильно объяснил )
Функция замены происходит только в том случае, когда нужно скопировать содержимое div в textarea, для просмотра и точной коррекции, и только для этого, это опциональное действие.
Цитата:

Сообщение от danik.js
Читаемости кем?

Читаемости в textarea после копирования из div. Но вообще правильно что уточнили.
Переписал пример в первом сообщении, чтоб понятней было.

mi.rafaylik 08.10.2013 13:45

Цитата:

Сообщение от danik.js
Тебе другой совет: не занимайся ерундой )

Если бы это использовалось при загрузке страницы - да, была бы ерунда ))

Deff 08.10.2013 20:38

Цитата:

Сообщение от mi.rafaylik
Как упростить цепь регулярных выражений

Цитата:

Сообщение от mi.rafaylik
replace(/<div>/g, '<p>') // заменяем блоки на параграфы
4 .replace(/<\/div>/g, '</p>')

http://jquery-docs.ru/Manipulation/replaceAll/ одновременно добавляем <br /> после параграфа

Цитата:

Сообщение от mi.rafaylik
.replace(/<p><\/p>/g, '') // удаляем пустые параграфы

$('p:empty').remove()

mi.rafaylik 08.10.2013 22:14

Deff, спасибо.
$('p:empty').remove() это конечно jQuery-way, но разве регулярное выражение не быстрей обработает?

Deff 09.10.2013 01:53

Цитата:

Сообщение от mi.rafaylik
$('p:empty').remove() это конечно jQuery-way, но разве регулярное выражение не быстрей обработает?

Сомнительно что по скорости вы выиграете более 20-30ms - на странице - стоит ли усугублять ? Тады есть смысл отказаться от jQuery и делать всё на нативном js - выиграете 100-200ms
Потом - уже созданный объект парситься быстрее регулярки, так что еще бабушка надвое сказала, поскольку при возврате регуляркой на страницу innerHTML, - повторное создание объектов и их рендринг могут занять больше времени


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