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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Многоуровневая замена

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: [tag][tag] [/tag][/tag]
Roler
Отправлено: 20 Августа, 2009 - 16:18:10
Post Id



Посетитель


Покинул форум
Сообщений всего: 458
Дата рег-ции: Авг. 2008  
Откуда: Россия


Помог: 1 раз(а)




Вообщем, я что-то не пойму, как сделать замену конструкции

на, допустим,


Заменяются только внешние теги, а как сделать так, чтобы заменились все?

P.S. Выражение
CODE (text):
скопировать код в буфер обмена
  1.  
  2. $text = preg_replace('#\[tag\](.*)\[\/tag\]#si', '<div class="tag">/1</div>', $text);
  3.  

(Отредактировано автором: 20 Августа, 2009 - 16:22:24)

 
 Top
Champion Супермодератор
Отправлено: 20 Августа, 2009 - 16:27:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Или рекурсивная регулярка, или нежадная замена в цикле, пока есть, что заменять. Во втором случае это будет так по шагам:
1 - [tag][tag] [/tag][/tag]
2 -<tag>[tag] </tag>[/tag]
3 - <tag><tag> </tag></tag>
(Добавление)
нежадность задается опцией U
 
 Top
Roler
Отправлено: 20 Августа, 2009 - 17:37:45
Post Id



Посетитель


Покинул форум
Сообщений всего: 458
Дата рег-ции: Авг. 2008  
Откуда: Россия


Помог: 1 раз(а)




Champion
Второй случай - это просто, понятно, но некрасиво.
Можно поподробнее про первый?
 
 Top
Champion Супермодератор
Отправлено: 20 Августа, 2009 - 17:41:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Цитата:
Рекурсивные шаблоны
Рассмотрим задачу поиска соответствия со строкой, находящихся внутри неограниченного количества круглых скобок. Без использования рекурсии лучшее, что можно сделать - написать шаблон, который будет решать задачу для некоторой ограниченной глубины вложенности, так как обработать неограниченную глубину не предоставляется возможным. В Perl 5.6 предоставлены некоторые экспериментальные возможности, которые в том числе позвояляют реализовать рекурсию в шаблонах. Специально обозначение (?R) используется для указания рекурсивной подмаски. Таким образом, приведем PCRE шаблон, решающий поставленную задачу (подразумевается, что используется модификатор PCRE_EXTENDED, незначащие пробелы игнорируются): \( ( (?>[^()]+) | (?R) )* \)

Вначале он соответствует открывающей круглой скобке. Далее он соответствует любому количеству подстрок, каждая из которых может быть последовательностью не-скобок, либо строкой, рекурсивно соответствующей шаблону (т.е. строкой, корректно заключенной в круглые скобки). И, в конце, идет закрывающая круглая скобка.

Приведенный пример шаблона использует вложенные неограниченные повторения, поэтому использование однократных шаблонов значительно ускоряет процесс сопоставления, особенно в случаях, когда строка не соответствует заданной маске. Например, если его применить к строке: (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(), то несоответствие будет обнаружено достаточно быстро. Но в случае, если однократные шаблоны не используются, сопоставление будет затягиваться на длительное время, так как существует множество способов разделения строки между квантификаторами + и *, и все они должны быть проверены, прежде чем будет выдано сообщение о неудаче.

Значение, устанавливаемое для захватывающей подмаски будет соответствовать значению, захваченному на наиболее глубоком уровне рекурсии. В случае, если приведенный выше шаблон сопоставляется со строкой (ab(cd)ef), захваченным значением будет 'ef', которое является последним значением, принимаемым на верхнем уровне. В случае, если добавить дополнительные скобки \( ( ( (?>[^()]+) | (?R) )* ) \), захваченным значением будет "ab(cd)ef". В случае, если в шаблоне встречается более, чем 15 захватывающих скобок, PCRE требуется больше памяти для обработки рекурсии, чем обычно. Память выделяется при помощи функции pcre_malloc, и освобождается соответственно функцией pcre_free. Если память не может быть выделена, сохраняются данные только для первых 15 захватывающих скобок, так как нет способа выдать ошибку out-of-memory изнутри рекурсии.
 
 Top
Roler
Отправлено: 20 Августа, 2009 - 18:00:42
Post Id



Посетитель


Покинул форум
Сообщений всего: 458
Дата рег-ции: Авг. 2008  
Откуда: Россия


Помог: 1 раз(а)




О Господи Не понял
Пойду разбирать это... Скобки слева в регулярке мне совершенно непонятны.
Спасибо.

(Отредактировано автором: 20 Августа, 2009 - 18:11:13)

 
 Top
Nestor
Отправлено: 20 Августа, 2009 - 18:10:17
Post Id



Частый гость


Покинул форум
Сообщений всего: 220
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




А можно подробнее о ?R


-----
Aurus CMS
 
 Top
Champion Супермодератор
Отправлено: 20 Августа, 2009 - 18:24:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Roler пишет:
Пойду разбирать это... Скобки слева в регулярке мне совершенно непонятны.
Ну там для примера парсится строка со скобками. Это самая первая и самая последняя. \( и \). В начале регулярки идет утверждение, что после текущего место идет последовательность нескобок...
 
 Top
Roler
Отправлено: 20 Августа, 2009 - 18:30:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 458
Дата рег-ции: Авг. 2008  
Откуда: Россия


Помог: 1 раз(а)




А ?> это что такое?
 
 Top
Champion Супермодератор
Отправлено: 20 Августа, 2009 - 18:39:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




 
 Top
Roler
Отправлено: 20 Августа, 2009 - 18:50:04
Post Id



Посетитель


Покинул форум
Сообщений всего: 458
Дата рег-ции: Авг. 2008  
Откуда: Россия


Помог: 1 раз(а)




Champion
Там нет такого условия.
 
 Top
Champion Супермодератор
Отправлено: 20 Августа, 2009 - 18:53:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Точно. Это то же, что (?=. Только употребляется с рекурсией. Хотя, если честно, я не углублялся в рекурсию и точно не могу сказать.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB