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>
Если вы знаете, что вам никогда не понадобится сопоставлять теги с другими тегами внутри них, вы можете заменить (.*?)
на ([^<>]++)
.
Мне тоже надоели откровенные ответы «не делай этого», но, как видите, у них есть веские причины - я мог бы придумать это гораздо больше, не обращаясь к каким-либо ссылкам. Когда вы спрашиваете "Как мне это сделать?" без знания или квалификации мы не знаем, сколько из этого вы уже знаете.