正则表达式匹配HTML标记内的文本

时间:2012-05-06 16:16:27

标签: php regex preg-replace

我正在尝试编写一个正在删除占位符文本周围的HTML标记的正则表达式,以便:

<p>
    Blah</p>
<p>
    {{{body}}}</p>
<p>
    Blah</p>

成为这个:

<p>
    Blah</p>
{{{body}}}
<p>
    Blah</p>

我目前的正则表达式为/<.+>.*\{\{\{body\}\}\}<\/.+>/msU。但是,它还会删除占位符前面的标记内容,从而产生:

{{{body}}}
<p>
    Blah</p>

我不能假设用户总是将占位符放在<p>内,所以我希望它能够在占位符周围删除任何一对标记。我很感激帮助纠正我的正则表达式。

[编辑]

我认为重要的是要注意CKEditor可能会也可能不会处理输入。它为开始标记添加了换行符和制表符,因此正则表达式需要使用/sm(dotall + multiline)修饰符。

2 个答案:

答案 0 :(得分:5)

试试这个:

<[^>]+>\s*\{{3}body\}{3}\s*<\/[^>]+>

在此处查看:[{3}}

以下是细分:

  • <[^>]+>匹配一个开头的HTML代码,只有那个。
  • \s*捕获任何空格(相当于[ \t\r\n]*
  • \{{3}恰好与{匹配3次
  • body字面上匹配字符串
  • \}{3}恰好与}匹配3次
  • 再次
  • \s*,捕获任何空白
  • <\/[^>]+>匹配结束HTML标记

答案 1 :(得分:1)

php strip_tags不能用于你的情况吗?

http://php.net/manual/en/function.strip-tags.php

<?php
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";

// Allow <p> and <a>
echo strip_tags($text, '<p><a>');
?>