如何遍历长字符串并用某些文本替换某些块?

时间:2010-07-05 09:13:00

标签: php regex parsing

我需要在我从文件中读取的文本中用<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>
可能有人给我一些指示,因为我以前没有真正使用过这种遍历。问题是迭代文本,同时相对于“slot_name”

更改块

4 个答案:

答案 0 :(得分:2)

由于您似乎正在进行直接搜索和替换,而不是实际解析HTML或XML,因此在此处执行正则表达式是一个非常有效的选项。
(如果你可能有现有的PHP包含这个插槽的东西,或者开始进入嵌套标签,评论等,你会想要使用DOM解析器。)

这个使用lookahead / lookbehind意味着整个匹配是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

第二个缺少前瞻,但使用简单的cature组语法( ... ),但没有新的语法。

(如果您确实想要完全学习正则表达式,regular-expressions.info值得完成tutorial。)

所以是的,这些行中的任何一行都会这样做:

preg_replace( "/(?<=<slot>\s*)\w+(?=\s*<\/slot>)/" , "<?php !include_slot('$0')?>" , $Input )
preg_replace( "/<slot>(\w+)\s*<\/slot>/" , "<?php !include_slot('$1')?>" , $Input )

(注意转义的正斜杠 - 或者你可以在开头/结尾使用不同的字符来分隔正则表达式。)

答案 1 :(得分:0)

使用基于DOM的XML解析器。请参阅今天的主题du jour,http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html

答案 2 :(得分:0)

XML解析器可以完成这项工作。你也可以用str_replace或正则表达式来做脏话。

答案 3 :(得分:0)

如果标记就像那样简单,并且它只会是<slot>[Whitespace]slot_name[Whitespace]</slot>那么正则表达式将是绝对正确的,并且XML解析器将是过度的。

如果您想学习正则表达式,请转到Regular-Expressions.info

如果您发现自己添加了越来越多的功能,并且它不再像上面概述的骨架一样简单,那么一定要开始使用正确的解析器。否则,做最简单的事情就可以了。