Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Повторяющиеся многострочные блоки
Форумы портала PHP.SU » PHP » Регулярные выражения » Повторяющиеся многострочные блоки

Страниц (1): [1]
 

1. hippp - 20 Июня, 2010 - 17:57:15 - перейти к сообщению
Друзья, не сможете подсказать. Сам уже замотался. Не помогает даже Regex.

В тексте страницы присутствует несколько многострочных блоков такого вида:

<!--
....................
....................
....................
//-->

<div>бла-бла-бла</div>

<!--
....................
....................
....................
//-->

Мне нужно удалить "<!--" и "//--> ", но так, чтобы не пострадали комментарии "<!-- ...... -->", а также другой текст внутри этих блоков и между ними.

Инструкция (?s:(.*|\s*) не помогает, т.к. захватывает весь текст от первого "<!--" до последнего "//--> ".

Надеюсь только на вас...
2. Champion - 20 Июня, 2010 - 18:11:27 - перейти к сообщению
preg_replace('#<!--.+//-->#mUsi', '', $src)
(Добавление)
preg_replace('#<!--(.+)//-->#mUsi', '\1', $src) - если внутренности комментария должны остаться. Я не понял из вопроса должны или не должны они остаться
3. hippp - 20 Июня, 2010 - 18:38:06 - перейти к сообщению
Champion пишет:
preg_replace('#<!--.+//-->#mUsi', '', $src)
(Добавление)
preg_replace('#<!--(.+)//-->#mUsi', '\1', $src) - если внутренности комментария должны остаться. Я не понял из вопроса должны или не должны они остаться


Champion, огромное спасибо за ответ. Но я наверное непонятно объяснил. Приведенная тобой инструкция всегда захватывает весь текст от первого "<!--" и до "//-->". А ведь первым может идти обычный однострочный комментарий, который трогать не надо. Вот так, например:

<!-- Комментарий -->

<!--
..............
..............
//-->
4. Champion - 20 Июня, 2010 - 18:50:40 - перейти к сообщению
Аа, да. Не так понял.
CODE (text):
скопировать код в буфер обмена
  1. preg_replace('#<!--(?:(?!-->).)+//-->#mUsi', '', $src)
А так?
5. hippp - 20 Июня, 2010 - 19:02:16 - перейти к сообщению
Champion пишет:
Аа, да. Не так понял.
CODE (text):
скопировать код в буфер обмена
  1. preg_replace('#<!--(?:(?!-->).)+//-->#mUsi', '', $src)


Champion, ты лучший! Теперь все работает как надо. Еще раз тебе спасибо. Улыбка
6. Phantik - 21 Июня, 2010 - 19:15:39 - перейти к сообщению
Champion, а скажи пожалуйста что означает в регулярках #, #mUsi ? Читал несколько документаций по теме, но с решетками не встречался. И еще про символ : тоже интересно было бы узнать.
7. EuGen - 22 Июня, 2010 - 10:49:44 - перейти к сообщению
# - разделитель, им может быть что угодно, не встречающееся в выражении (чаще всего используется "/")
m - мультистрочное выражение
U - использовать многобайтовую кодировку (юникод)
i - не учитывать регистр при проверке на совпадение
8. Мелкий - 22 Июня, 2010 - 14:01:11 - перейти к сообщению
EuGen пишет:
U - использовать многобайтовую кодировку (юникод)

ммм?
http://php.su/lessons/?lesson_17
Цитата:
U - инвертирует жадность.
9. JustUserR - 22 Июня, 2010 - 14:25:03 - перейти к сообщению
EuGen пишет:
U - использовать многобайтовую кодировку (юникод)
Если буква u маленькая то это разумеется так - но при использовании этого модификатора надо быть осторожным и лучше использовать его вместе с функциями mb-строк http://webew[dot]ru/posts/1836[dot]webew?v=f
10. Champion - 22 Июня, 2010 - 19:02:07 - перейти к сообщению
Phantik пишет:
И еще про символ :
(?:шаблон) - такой шаблон не будет запомнен в подмаску. Если просто скобки написать, то результат запомнится. А он нам не нужен, поэтому ?:.
11. EuGen - 23 Июня, 2010 - 10:45:48 - перейти к сообщению
Верно, не посмотрел, что U а не u. Сетовать на зрение не буду. Аудитории спасибо за внимательность.
12. JustUserR - 23 Июня, 2010 - 14:22:27 - перейти к сообщению
Phantik пишет:
И еще про символ : тоже интересно было бы узнать
При построении регулярных выражений также часто используюся операторы просмотра вперед и назад - они нужны для того чтобы при составлении некоторого соответствия смотреть его контекст не включая его самого в соответствие http://ru[dot]wikipedia[dot]org/wiki/%D0[dot][dot][dot]0[dot]B7[dot]D0[dot]B0[dot]D0[dot]B4
13. Champion - 23 Июня, 2010 - 17:59:13 - перейти к сообщению
Просмотр вперед и назад - это другое. Здесь просто группировка символов, чтобы потом применить к ним, например, *, +, {3,7} - такую вещь.
Вот такую строчку если взять "asfsfd",
то /a(?:sf)+d/ сматчит ее,
а вот просмотр вперед:
/a(?=sfsf)d/ - так не сматчит,
/a(?=sfsf)sfsfd/ - а так сматчит.

Т.е. разница в том, что при просмотре вперед мы стоим на месте.
14. JustUserR - 24 Июня, 2010 - 15:34:15 - перейти к сообщению
Champion пишет:
Просмотр вперед и назад - это другое. Здесь просто группировка символов, чтобы потом применить к ним, например, *, +, {3,7} - такую вещь.
Спасибо но я это знаю - просто раз выше пошел разговор о синтаксических единицах регулярных выражений - то я решил упомянуть о конструкции просмотра вперед/назад которая по синтаксису похоже на незапоминающие круглые скобки Улыбка
15. Champion - 24 Июня, 2010 - 18:16:20 - перейти к сообщению
Champion пишет:
Спасибо но я это знаю
Да в общем-то я не сомневался. Просто уточнил, потому что фразу двояко понял.

 

Powered by ExBB FM 1.0 RC1