Еще один вопрос по регулярке php.

O
На сайте с 23.09.2014
Offline
76
331

Есть регулярное выражение:


$label = "[a-z_]+";
$template = preg_replace("#\\[$label\\](.*?)\\[\\/$label\\]#ies", "", $template);

с помощью которого скрывается контент обрамленный например [info]любой контент[/info]

Но если в средине этого тега есть еще один например:


[info]
[cont]
<div>любой контернт</div>
[/cont]
<p>текст текст текст</p>
[/info]

Тогда регулярка работает не так как нужно. Все содержимое не будет скрыто. А скрытие контента осуществляется от тега [info] до [/cont], и дальше контент отображается:


<p>текст текст текст</p>
[/info]

Все потому что регулярное выражение не понимает совпадения $label. При этом значение $label заранее не известно.

Вопрос как составить регулярное выражение, которое соответствовало условию: \\[$label\\] должно точно соответствовать [\\/$label\\]. То есть чтобы мои теги скрытия контента соответствовали один к одному: [cont][/cont], [info][/info]

Я так думаю нужно применить обратные ссылки, но как это сделать..

J
На сайте с 20.02.2014
Offline
120
jkm
#1

http://php.net/manual/ru/regexp.reference.back-references.php


$template = preg_replace("#\\[([a-z]+)\\](.*?)\\[\\/\\1\\]#ies", "", $template);
siv1987
На сайте с 02.04.2009
Offline
427
#2

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

K
На сайте с 03.06.2015
Offline
45
#3
Osavul:
должно точно соответствовать [\\/$label\\]

Да, но вы же два раза скобки получили. В переменной нарисовали и в шаблоне. Не факт что так будет работать.

Ну да, в метке должна быть метка, как текст, без спец-символов.

PS Я бы вам посоветовал избавиться от магических двойных кавычек и конкатенировать скаляры с переменными нормально.

MYSQL PHP JS HTML CSS SEO TXT США СССР

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий