我需要在我从文件中读取的文本中用<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”更改块
答案 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。
如果您发现自己添加了越来越多的功能,并且它不再像上面概述的骨架一样简单,那么一定要开始使用正确的解析器。否则,做最简单的事情就可以了。