Как пройти через длинную строку и заменить определенный блок определенным текстом? - PullRequest
1 голос
/ 05 июля 2010

Мне нужно заменить <slot> slot_name </slot> на <?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>

, кто-нибудь может дать мне несколько указаний, так как я раньше не работал с этим видом обхода,Проблема состоит в том, чтобы перебрать текст и в то же время изменить блок относительно «имени_ слота»

Ответы [ 4 ]

2 голосов
/ 05 июля 2010

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

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

0 голосов
/ 05 июля 2010

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

0 голосов
/ 05 июля 2010

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

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

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

0 голосов
/ 05 июля 2010

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

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