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 )