Php 如何遍历长字符串并用特定文本替换特定块?

Php 如何遍历长字符串并用特定文本替换特定块?,php,regex,parsing,Php,Regex,Parsing,我需要在从文件中读取的文本中用替换slot\u name <table class="layout-table" id="layout1"> <tr> <td class="slot" id="slot1" colspan="2"> <slot> slot_name </slot> </td> &l

我需要在从文件中读取的文本中用
替换
slot\u 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”相关的块。

使用基于DOM的XML解析器。请参阅今天的主题《每日新闻》。

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

如果标记像这样简单,而且它永远只会是
[Whitespace]slot\u name[Whitespace]
,那么正则表达式就完全可以了,而XML解析器就太过了

如果你想学习正则表达式,请访问


如果您发现自己添加了越来越多的功能,并且不再像上面概述的框架那样简单,那么请务必开始使用适当的解析器。否则,请做可能可行的最简单的事情。

因为您看起来是在进行直接搜索和替换,而不是实际解析HTML或XML,所以在这里执行正则表达式是一个非常有效的选项。
(如果您可能已经有了包含此插槽内容的现有PHP,或者开始使用嵌套标记、注释和类似内容,那么您将需要使用DOM解析器。)

这一个使用lookahead/lookahead表示整个匹配是slot\u name:

(?<=<slot>\s*)\w+(?=\s*</slot>)

(请注意转义的前斜杠-或者,您可以在开始/结束处使用不同的字符来分隔正则表达式。)

您能否就步骤进行一点描述,因为我清楚地知道如何替换所有出现的块,但问题在于“slot_name”我必须对其进行操作,每次都会有不同的名字。感谢您记住,放在字符串中的php代码将不会被计算。因此,这些文件将不包括在内。如果不打算这样做,那么在替换后必须对字符串运行eval(),这可能会很危险。为什么你会使用环顾四周而不是一个简单的捕获组?不是拖拉,只是出于兴趣。好吧,主要是因为环顾四周更接近正在做的事情的意图——“找到前缀为A、后缀为B的X”。但同时,展示不同的选择也很好——增加人们的曝光度,并为他们提供其他情况的想法。当然,要提醒人们,
$0
是存在的,因为很多人忘记了(或永远不会知道)这一点
<slot>\s*(\w+)\s*</slot>
(?<=        # 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
preg_replace( "/(?<=<slot>\s*)\w+(?=\s*<\/slot>)/" , "<?php !include_slot('$0')?>" , $Input )
preg_replace( "/<slot>(\w+)\s*<\/slot>/" , "<?php !include_slot('$1')?>" , $Input )