[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регулярные выражения
John Cena
Доброе время суток, подскажите пожалуста каким дожно быть регулярное выражение что бы из строки

<p><!--Hello --></p><p>Bla-bla-bla</p>

удалилось <!--Hello --> и осталось <p>Bla-bla-bla</p> или хотя бы <p></p><p>Bla-bla-bla</p>

Заранее спасибо!



Спустя 12 минут, 4 секунды (5.03.2011 - 07:57) inpost написал(а):
John Cena
Прям сразу для знатоков, чтобы они писали за Вас код? Не кажется данное действие для новичка уж слишком резвым? =)
А как Вы пробовали при помощи регулярного выражения вырезать? Покажите строку и Ваш код, попробуем разобрать, где Вы допустили ошибку. Учтите, что за Вас никто код писать не будет, по крайней мере бесплатно, а вот исправить уже существующий Ваш код - это всегда пожалуйста +)

Спустя 2 дня, 6 часов, 37 минут, 58 секунд (7.03.2011 - 14:35) Dron19 написал(а):
Ладно, за него уж написал код, лови


<?php

$text = '<p><!--Hello --></p><p>Bla-bla-bla</p>';
$text = preg_replace("#(?:<!--.*?-->)#ui", "", $text);
echo $text;

?>


Но учти, этот код работает правильно, при условии, что внутри <!-- этого html комментария нет ни одного символа ' - ' кроме закрывающих комментарий тире -->

Спустя 5 минут, 40 секунд (7.03.2011 - 14:41) Dron19 написал(а):
то есть у тебя есть право задать и такую строку для обработки

<p><!--Hыаello --><!--Hello8976 --><!--Hello --><!--Hello --><!--Hello --><!--Heапвпывап -->
</p><p>Bla-bla-bla</p><!--Hello --><!--Hello --><!--Hello --><!--Hello --><!--Hello -->

Все равно он из нее выберет только

<p></p><p>Bla-bla-bla</p>

Спустя 11 минут, 13 секунд (7.03.2011 - 14:52) sergeiss написал(а):
И еще один вопрос: а зачем вообще регулярка тут нужна? Правило достаточно простое, поэтому можно использовать не регулярки, а более простые средства. Быстрее будет. Да и более понятно.

Спустя 4 минуты, 16 секунд (7.03.2011 - 14:56) Dron19 написал(а):
Цитата (John Cena @ 5.03.2011 - 04:45)
Доброе время суток, подскажите пожалуста каким дожно быть регулярное выражение что бы из строки

<p><!--Hello --></p><p>Bla-bla-bla</p>

удалилось <!--Hello --> и осталось <p>Bla-bla-bla</p> или хотя бы <p></p><p>Bla-bla-bla</p>

Заранее спасибо!

sergeiss

Спустя 12 минут, 1 секунда (7.03.2011 - 15:08) sergeiss написал(а):
Dron19 - твой ответ не понял... Ты хочешь сказать, что ТС спросил именно про регулярки и поэтому ответ был про них? Это я понял. Но вот мне как раз и не понятно, зачем они тут smile.gif

Спустя 3 минуты (7.03.2011 - 15:11) Dron19 написал(а):
sergeiss, ясно, ну предложи свой вариант, что бы все html комменты удалял. Интересно еще способы посмотреть.

Спустя 11 минут, 42 секунды (7.03.2011 - 15:23) Trianon написал(а):
Цитата (Dron19 @ 7.03.2011 - 14:35)
Но учти, этот код работает правильно, при условии, что внутри <!-- этого html комментария нет ни одного символа ' - ' кроме закрывающих комментарий тире -->


А если Bla-bla-bla встретится внутри комментария, что будет?



Спустя 37 секунд (7.03.2011 - 15:24) DmitryOpalev написал(а):
Удалит

Спустя 1 минута, 55 секунд (7.03.2011 - 15:26) Dron19 написал(а):
Цитата (DmitryOpalev @ 7.03.2011 - 12:24)
Удалит

неа =) в Bla-bla-bla встречаются символы -, а там стоит ленивый поиск, следовательно он удалить до первой Bla,а дальше оторванный кусок комментария останется и будет висеть...

Спустя 3 минуты (7.03.2011 - 15:29) Dron19 написал(а):
то есть вот так волучится -bla-bla -->, ну остальные если в них симмвола - не встречается удалит нормально

Спустя 2 минуты, 58 секунд (7.03.2011 - 15:32) Dron19 написал(а):
вот немножко дописал регулярное выражение и теперь символы - разрешены
то есть даже встретя Bla-bla-bla успешно удалит


<?php

$text = '<p><!--Hello Bla-bla-bla --></p><p>Bla-bla-bla</p><!--Hello --><!--Hello -->';
$text = preg_replace("#(?:(<!--).*?(-->))#ui", "", $text);
echo $text;

?>

Спустя 2 минуты, 19 секунд (7.03.2011 - 15:34) Trianon написал(а):
А теперь выкиньте эти лишние скобки.
Первое выражение удаляет Bla-bla-bla точно с тем же успехом.

Если уж и изменять шаблон, то изменять так, чтоб он работал независимо от жадности.

Спустя 20 секунд (7.03.2011 - 15:34) DedMorozzz написал(а):
sergeiss
очевидное заблуждение, что регулярки медленные. Чуть. Потестите и увидете, что ПРОСТЫЕ регулярки весьма шустрые, а только те, в которых много правил - тормозят.

Спустя 1 минута, 37 секунд (7.03.2011 - 15:36) DedMorozzz написал(а):
Trianon
на самом деле 1е скобки нужны. Точнее не нужны, но ускоряют регулярку. Ибо не записывается вхождение. Это чуть-чуть но быстрее smile.gif Остальные - и вправду не нужны.
Хоть разница в скорости жутко маленькая, но всё же.

Спустя 6 минут, 31 секунда (7.03.2011 - 15:42) Dron19 написал(а):
DedMorozzz, напиши пожалуйста регулярку, без лишних скобок, хочу посмотреть
Trianon, я думал хоть спасибо за регулярку скажешь ohmy.gif

Спустя 7 минут, 32 секунды (7.03.2011 - 15:50) DedMorozzz написал(а):
Да ты написал правильно всё. Только внутренние скобки не нужны...хм, в данной ситуации вообще не нужны никакие. (?: pattern ) == pattern. Это две идентичные записи.
$text = preg_replace("#<!--.*?-->#ui", "", $text);

Вот так выглядит
И трианон не ТС :)

Спустя 2 минуты, 18 секунд (7.03.2011 - 15:52) Dron19 написал(а):
DedMorozzz, тормознул я, сначала хотел написать через прег_матч,а там этот шаблон нужен был, что бы в массив не попали комменты и автоматом, по привычке написал через прег_реплэйс

Спустя 6 минут, 19 секунд (7.03.2011 - 15:58) Trianon написал(а):
Цитата
очевидное заблуждение, что регулярки медленные. Чуть. Потестите и увидете, что ПРОСТЫЕ регулярки весьма шустрые, а только те, в которых много правил - тормозят.


Они и тормозят-то обычно, не из-за большого количества правил, а из-за неопределенности утверждений.
К примеру, детерминированная регулярка, решающая ту же задачу, выглядела бы так:
#<!--(?:[^-]*|-(?!->))*-->#su


Просто чем сложнее правила, тем проще эту неопределенность допустить.

Спустя 31 минута, 53 секунды (7.03.2011 - 16:30) Trianon написал(а):
Цитата (DedMorozzz @ 7.03.2011 - 15:36)
Trianon
на самом деле 1е скобки нужны. Точнее не нужны, но ускоряют регулярку. Ибо не записывается вхождение. Это чуть-чуть но быстрее smile.gif Остальные - и вправду не нужны.
Хоть разница в скорости жутко маленькая, но всё же.


Ну это ж мелочи...

Если рассматривать факторы, от которых запвисит скорость работы механизма regexp'ов, то я бы расположил их в таком порядке по степени влияния:

1. Детерминированный шаблон, по возможности предотвращающий потенциальные откаты назад в процессе анализа. Для этого следует избегать ставить открытые квантификаторы (+ и *) после неограниченного набора символов (.)
2. Употребление однократных (компаундных) подмасок (?> ... ) с целью ... с той же, в принципе, целью - убрать ненужные откаты назад.
3. Употребление незахватывающих подмасок - чтобы предотвратить создание лишних элементов в массиве захвата.

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.