Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.10.2013, 10:57
Аватар для mi.rafaylik
Кандидат Javascript-наук
Отправить личное сообщение для mi.rafaylik Посмотреть профиль Найти все сообщения от mi.rafaylik
 
Регистрация: 07.12.2012
Сообщений: 113

Как упростить цепь регулярных выражений
Прошу совета - стоит ли сокращать количество прохождений регулярок в тексте, или такая конструкция допустима?
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, '')

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

Последний раз редактировалось mi.rafaylik, 08.10.2013 в 14:44.
Ответить с цитированием
  #2 (permalink)  
Старый 08.10.2013, 11:06
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,202

Сообщение от mi.rafaylik
добавляем переносы строк после параграфов для лучше читаемости
Т.е. ЦССа у тебя нет принципиально?
Ответить с цитированием
  #3 (permalink)  
Старый 08.10.2013, 11:11
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от mi.rafaylik
Прошу совета
Тебе другой совет: не занимайся ерундой )
А если ты не считаеть написанное выше ерундой - то лучше вообще не занимайся программированием
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 08.10.2013, 11:14
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,202

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

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.
Но ерундой таки лучше не заниматься.
Ответить с цитированием
  #5 (permalink)  
Старый 08.10.2013, 11:27
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от mi.rafaylik
// добавляем переносы строк после параграфов для лучше читаемости
Читаемости кем? Браузером? Или это на стороне сервера все происходит?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 08.10.2013, 11:45
Аватар для mi.rafaylik
Кандидат Javascript-наук
Отправить личное сообщение для mi.rafaylik Посмотреть профиль Найти все сообщения от mi.rafaylik
 
Регистрация: 07.12.2012
Сообщений: 113

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

Последний раз редактировалось mi.rafaylik, 08.10.2013 в 13:52.
Ответить с цитированием
  #7 (permalink)  
Старый 08.10.2013, 13:45
Аватар для mi.rafaylik
Кандидат Javascript-наук
Отправить личное сообщение для mi.rafaylik Посмотреть профиль Найти все сообщения от mi.rafaylik
 
Регистрация: 07.12.2012
Сообщений: 113

Сообщение от danik.js
Тебе другой совет: не занимайся ерундой )
Если бы это использовалось при загрузке страницы - да, была бы ерунда ))

Последний раз редактировалось mi.rafaylik, 08.10.2013 в 13:48.
Ответить с цитированием
  #8 (permalink)  
Старый 08.10.2013, 20:38
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от 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()

Последний раз редактировалось Deff, 08.10.2013 в 20:43.
Ответить с цитированием
  #9 (permalink)  
Старый 08.10.2013, 22:14
Аватар для mi.rafaylik
Кандидат Javascript-наук
Отправить личное сообщение для mi.rafaylik Посмотреть профиль Найти все сообщения от mi.rafaylik
 
Регистрация: 07.12.2012
Сообщений: 113

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

Последний раз редактировалось mi.rafaylik, 09.10.2013 в 00:19.
Ответить с цитированием
  #10 (permalink)  
Старый 09.10.2013, 01:53
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от mi.rafaylik
$('p:empty').remove() это конечно jQuery-way, но разве регулярное выражение не быстрей обработает?
Сомнительно что по скорости вы выиграете более 20-30ms - на странице - стоит ли усугублять ? Тады есть смысл отказаться от jQuery и делать всё на нативном js - выиграете 100-200ms
Потом - уже созданный объект парситься быстрее регулярки, так что еще бабушка надвое сказала, поскольку при возврате регуляркой на страницу innerHTML, - повторное создание объектов и их рендринг могут занять больше времени

Последний раз редактировалось Deff, 09.10.2013 в 04:04.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открытие div блока при первом визите на сайт Nushaba Общие вопросы Javascript 28 20.12.2013 21:24
Как обрезать строку и добавить символы в середине, в зависимости от длинны строки andreyua Firefox/Mozilla 12 10.12.2010 15:44
О наследовании событий, или как корректно его отменить. JCShen Events/DOM/Window 8 09.02.2010 00:00
Как правильно послать XML в POST запросе LowCoder AJAX и COMET 10 15.07.2009 23:20
Изменить таг с помощью регулярных выражений alexKniaz Общие вопросы Javascript 1 28.10.2008 17:38