preg_replace仅删除结束标记

时间:2014-06-25 10:46:05

标签: php regex domdocument

我正在使用一个使用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执行此操作?

任何想法都会非常感激。

感谢。

3 个答案:

答案 0 :(得分:2)

探索一些正则表达式功能的好机会!

关于使用正则表达式处理xml类型文档的所有免责声明......这样的任务有几个有趣的选项。

选项1:简单但可靠

$replaced = preg_replace('%(<jot.*?</jot>)</jot>%', '$1', $yourstring);
  • 为了安全起见,我们会在最后匹配您的整个字符串,包括两个</jot>
  • .*?“懒星点”量词确保我们不会意外地超过第一次结束</jot>
  • 括号捕获您想要的字符串1
  • 我们用第1组替换

选项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)

以下正则表达式会捕获</符号后面的所有字符,在替换部分中,它会用空字符串替换匹配的字符。

<\/.*$

<强>解释

  • <匹配文字<符号。
  • \/匹配正斜杠/
  • .*$匹配最后一个字符。

DEMO

您的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);

来自documentation

  
    

如果你不需要花哨的替换规则(比如正则表达式),你应该总是使用这个函数而不是preg_replace()。