Поскольку вы, похоже, делаете прямой поиск и замену, а не анализируете HTML или XML, выполнение регулярного выражения здесь является вполне допустимым вариантом.
(Если у вас может быть существующий PHP, содержащий этот слот, или иным образом начнете проникать во вложенные теги, комментировать и т. П., Вы захотите использовать анализатор DOM.)
Этот использует lookahead / lookbehind, чтобы означать, что все совпадение - имя_слота:
(?<=<slot>\s*)\w+(?=\s*</slot>)
В качестве альтернативы, это поместит имя слота в группу захвата 1:
<slot>\s*(\w+)\s*</slot>
(Они оба предполагают, что slot_name состоит из «символов слова», которые состоят из букв, цифр и подчеркивания.)
Объяснение первого:
(?<= # begin positive lookbehind
<slot> # literal text
\s* # zero or more whitespace
) # end positive lookbehind
\w+ # one or more word characters
(?= # begin positive lookahead
\s* # zero or more whitespace
</slot> # literal text
) # end positive lookahead
Второй не имеет заглядывания, но использует простой синтаксис группы cature (
... )
, но в остальном новый синтаксис отсутствует.
(Если вы хотите полностью выучить регулярные выражения, регулярные-выражения.info имеет учебник , достойный завершения.)
Так что да, любая из этих строк сделает это:
preg_replace( "/(?<=<slot>\s*)\w+(?=\s*<\/slot>)/" , "<?php !include_slot('$0')?>" , $Input )
preg_replace( "/<slot>(\w+)\s*<\/slot>/" , "<?php !include_slot('$1')?>" , $Input )
(Обратите внимание на экранированные косые черты - в качестве альтернативы вы можете использовать разные символы в начале / конце для ограничения регулярного выражения.)