Помогите с Regex в PHP - PullRequest
       1

Помогите с Regex в PHP

1 голос
/ 26 августа 2010

Давайте предположим, что я делаю preg_replace следующим образом:

preg_replace ("/<my_tag>(.*)<\/my_tag>/U", "<my_new_tag>$1</my_new_tag>", $sourse);

Это работает, но я также хочу получить атрибут my_tag - как бы мне это сделать:

<my_tag my_attribute_that_know_the_name_of="some_value">tra-la-la</my_tag>

Ответы [ 3 ]

1 голос
/ 26 августа 2010

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

1 голос
/ 26 августа 2010
preg_replace('#<my_tag\b([^>]*)>(.*?)</my_tag>#',
   '<my_new_tag$1>$2</my_new_tag>', $source)

([^>]*) захватывает что-либо после имени тега и перед закрытием >. Конечно, > допустимо в значениях атрибутов HTML, так что следите за этим (но я никогда не видел его в дикой природе). \b предотвращает совпадения имен тегов, которые происходят с началом с my_tag, предотвращая поддельные совпадения, подобные этому:

<my_tag_xyz>ooga-booga</my_tag_xyz><my_tag>tra-la-la</my_tag>

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

<my_tag><my_tag>tra-la-la</my_tag>

Если вы знаете, что вам никогда не понадобится сопоставлять теги с другими тегами внутри них, вы можете заменить (.*?) на ([^<>]++).

Мне тоже надоели откровенные ответы «не делай этого», но, как видите, у них есть веские причины - я мог бы придумать это гораздо больше, не обращаясь к каким-либо ссылкам. Когда вы спрашиваете "Как мне это сделать?" без знания или квалификации мы не знаем, сколько из этого вы уже знаете.

0 голосов
/ 26 августа 2010

Забудьте регулярные выражения, используйте вместо этого:

http://simplehtmldom.sourceforge.net/

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