我正在使用一个使用JotCache作为缓存组件的joomla站点。 要从模板文件中直接从缓存中排除某些模块,该组件使用自己的“标记”,例如:
<jot myposition s> Module Position <jot myposition e>
现在,我正在尝试使用DOMDocument将html通过php缩小,但结果是这样,缓存组件不起作用:
<jot myposition s> Module Position <jot myposition e></jot></jot>
我正在考虑使用preg_replace去除</jot>
结束标记。
我尝试了这个正则表达式"/<[\/]*jot[^>]*>/i"
,但它删除了所有<jot>
个标记,包括所需的<jot myposition s>
和<jot myposition e>
。
由于我不确定如何使用DOMDocument完成此操作(防止标签自动关闭),如何使用preg_replace执行此操作?
任何想法都会非常感激。
感谢。
答案 0 :(得分:2)
探索一些正则表达式功能的好机会!
关于使用正则表达式处理xml类型文档的所有免责声明......这样的任务有几个有趣的选项。
选项1:简单但可靠
$replaced = preg_replace('%(<jot.*?</jot>)</jot>%', '$1', $yourstring);
</jot>
。.*?
“懒星点”量词确保我们不会意外地超过第一次结束</jot>
选项2:更“厚颜无耻”
$replaced = preg_replace('%</jot></jot>%', '</jot>', $yourstring);
</jot></jot>
</jot>
选项3:未来派
$replaced = preg_replace('%</jot>(?=</jot>)%', '', $yourstring);
</jot>
,然后前瞻(?=</jot>)
断言</jot>
可以再次找到,但不匹配。选项4:外出!
$replaced = preg_replace('%<jot.*?</jot>\K</jot>%', '', $yourstring);
<jot.*?</jot>
匹配整个标记... \K
告诉引擎放弃到目前为止匹配的内容!</jot>
匹配第二个</jot>
答案 1 :(得分:0)
以下正则表达式会捕获</
符号后面的所有字符,在替换部分中,它会用空字符串替换匹配的字符。
<\/.*$
<强>解释强>
<
匹配文字<
符号。\/
匹配正斜杠/
.*$
匹配最后一个字符。您的PHP代码将是,
<?php
$re = '~<\/.*$~';
$str= '<jot myposition s> Module Position <jot myposition e></jot></jot>';
$replacement = "";
echo preg_replace($re, "", $str);
?> //=> <jot myposition s> Module Position <jot myposition e>
答案 2 :(得分:0)
如果您要剥离</jot>
,为什么不使用str_replace
使用更简单的方法?
$output = '<jot myposition s> Module Position <jot myposition e></jot></jot>';
$output = str_replace('</jot>', '', $output);
如果你不需要花哨的替换规则(比如正则表达式),你应该总是使用这个函数而不是preg_replace()。