Как пересечь через длинную строку и заменить определенный блок определенным текстом?

Я должен заменить <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"

1
задан simple 5 July 2010 в 09:13
поделиться

4 ответа

Поскольку кажется, что вы выполняете прямой поиск и замену, а не выполняете синтаксический анализ 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 )

(Обратите внимание на экранированные косые черты - в качестве альтернативы вы можете использовать разные символы в начале / конце для разделения регулярного выражения.)

2
ответ дан 2 September 2019 в 23:17
поделиться

Использовать анализатор XML на основе DOM. См. Сегодняшнюю тему в журнале http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html .

0
ответ дан 2 September 2019 в 23:17
поделиться

Синтаксический анализатор XML может выполнить эту работу. Вы также можете сделать это грязным способом с помощью str_replace или регулярного выражения.

0
ответ дан 2 September 2019 в 23:17
поделиться

Если разметка настолько проста, что в ней будет только [Whitespace]slot_name[Whitespace], то регулярное выражение будет абсолютно нормально, а XML-парсер будет излишеством.

Если вы хотите изучить regex, зайдите на Regular-Expressions.info.

Если вы обнаружите, что добавляете все больше и больше функциональности, и она перестает быть такой простой, как описанный выше скелет, то, конечно, начните использовать соответствующий парсер. В противном случае сделайте самое простое, что может работать.

0
ответ дан 2 September 2019 в 23:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: