Регулярка

12
S
На сайте с 11.03.2010
Offline
29
614

Добрый вечер, подскажите пожалуйста

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

например

<tag 1><a>какой-то текст</a></tag><tag 1><a><tag 2>текст</tag></a></tag>

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

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

preg_replace("/<tag 1>([^(<tag)]*)<\/tag>/i",'<b>\\1</b>', $str);

Но это конечно не работает, потому, что конструкция c [] думает, что там сиволы а не слово полностью, как мне пропустить внутри тега все другие теги, кроме конкретного?

Спасибо.

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#1

Что есть в оригинале и что нужно получить, лучше так напишите.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
S
На сайте с 11.03.2010
Offline
29
#2
LEOnidUKG:
Что есть в оригинале и что нужно получить, лучше так напишите.

Исходный код


<b id=1>
<a>
<b id=1><teg>text</teg></b>
</a>
<b id=1>text</b>
<b id=2>text</b>
</b>

Надо


<b id=1>
<a>
<newteg><teg>text</teg></newteg>
</a>
<newteg>text</newteg>
<b id=2>text</b>
</b>

В идеале конечно надо просто все теги <b param=1></b> заменить на новый тег, но при этом не трогать <b param=2>

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#3
secach:

В идеале конечно надо просто все теги <b param=1></b> заменить на новый тег, но при этом не трогать <b param=2>

дыг может быть просто str_replace?

S
На сайте с 11.03.2010
Offline
29
#4
LEOnidUKG:
дыг может быть просто str_replace?

Разве он не просто строку заменяет, яж не знаю, что может быть между <b param1>...</b>

главное не пропустить похожий тег внутри, чтоб не получилось <newtag>...</b>...<b param=1>...</newtag>, но надо, чтоб проходили другие теги, т.е. /'<b param1>(.*)</b>'/ пропустит все, /'<b param1>([^<]*)</b>'/ непропустит другие теги, а как сделать, чтото типа

/'<b param1>([^(<b)]*)</b>'/ , только, чтоб <b считалось одним словом, а не набором символов < и b

siv1987
На сайте с 02.04.2009
Offline
427
#5

LEOnidUKG, а как заменишь <b param=1></b> на новый тег например span, не задев <b param=2></b>, при том что это могут быть вложенные теги?

Автору советую юзать DOM. Для парсинга html регулярные выражения не самый удачный вариант, тем более на произвольном документе.

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#6
siv1987:
LEOnidUKG, а как заменишь <b param=1></b> на новый тег например span, не задев <b param=2></b>, при том что это могут быть вложенные теги?

Я вообще не врубаюсь в задачу :)

Кстати, какой DOM, если там и вложенность произвольная?

Я бы надеялся, что там как-то построчно можно сделать. А вообще меня примеры ТС пугают и в них нифига не понятно.

siv1987
На сайте с 02.04.2009
Offline
427
#7

А почему для DOM-а вложенность должна быть проблемой? getElement, xpath.. Правда как заменить сам тег я тоже пока еще не знаю. :)

ТС, попробуйте


'/<b>((?:(?!<b>).)*?)<\/b>/is'
bay_ebook
На сайте с 28.05.2010
Offline
111
#8
siv1987:
LEOnidUKG, а как заменишь <b param=1></b> на новый тег например span, не задев <b param=2></b>, при том что это могут быть вложенные теги?

Автору советую юзать DOM. Для парсинга html регулярные выражения не самый удачный вариант, тем более на произвольном документе.

-----------------------------

Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
S
На сайте с 11.03.2010
Offline
29
#9
siv1987:


'/<b>((?:(?!<b>).)*?)<\/b>/is'

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

(?!<b>) - это получается маска отрицания слова <b>, а ?: наличие маски отрицания и любой символ, я правильно понял? Плохо сформулировал, конечно.

В любом случае, еще раз спасибо, а то я зациклился на [^ ], которое и так понятно тут не уместно, а все правила еще не выучил, редко сталкиваюсь.

богоносец
На сайте с 30.01.2007
Offline
774
#10
secach:
param=1

Если бы это был правильный xml, то не трудно было бы написать xslt.

12

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