Я должен заменить <slot> slot_name </slot>
с a <?php !include_slot('slot_name')?>
в тексте, который я прочитал из файла
<table class="layout-table" id="layout1">
<tr>
<td class="slot" id="slot1" colspan="2">
<slot>
slot_name
</slot>
</td>
</tr>
<tr>
<td class="slot" id="slot2" rowspan="2">
<slot>
slot_name
</slot>
</td>
<td class="slot" id="slot3">
<slot>
slot_name
</slot>
</td>
</tr>
</table>
мог кто-либо давать мне некоторые направления, поскольку я действительно не работал с этим отчасти пересекающим прежде. Проблема состоит в том, чтобы выполнить итерации через текст, и в то же время изменяют блок относительно "slot_name"
Поскольку кажется, что вы выполняете прямой поиск и замену, а не выполняете синтаксический анализ HTML или XML, использование регулярного выражения здесь является вполне допустимым вариантом.
(Если у вас может быть существующий PHP, содержащий этот материал для слотов, или если вы иным образом начинаете проникать во вложенные теги, комментировать и т. Д., Вы захотите использовать парсер DOM.)
Этот использует просмотр вперед / назад для означают, что полное совпадение - slot_name:
(?<=<slot>\s*)\w+(?=\s*</slot>)
В качестве альтернативы, это поместит slot_name в группу захвата 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
Во втором отсутствует просмотр вперед, но используется простой синтаксис группы категорий (
... )
, но в остальном он не является новым синтаксисом.
(Если вы хотите полностью изучить регулярные выражения, regular-expressions.info содержит учебное пособие , которое стоит изучить.)
Так что да, любая из этих строк будет сделайте это:
preg_replace( "/(?<=<slot>\s*)\w+(?=\s*<\/slot>)/" , "<?php !include_slot('$0')?>" , $Input )
preg_replace( "/<slot>(\w+)\s*<\/slot>/" , "<?php !include_slot('$1')?>" , $Input )
(Обратите внимание на экранированные косые черты - в качестве альтернативы вы можете использовать разные символы в начале / конце для разделения регулярного выражения.)
Использовать анализатор XML на основе DOM. См. Сегодняшнюю тему в журнале http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html .
Синтаксический анализатор XML может выполнить эту работу. Вы также можете сделать это грязным способом с помощью str_replace или регулярного выражения.
Если разметка настолько проста, что в ней будет только
, то регулярное выражение будет абсолютно нормально, а XML-парсер будет излишеством.
Если вы хотите изучить regex, зайдите на Regular-Expressions.info.
Если вы обнаружите, что добавляете все больше и больше функциональности, и она перестает быть такой простой, как описанный выше скелет, то, конечно, начните использовать соответствующий парсер. В противном случае сделайте самое простое, что может работать.