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

min*_*gos 1 php regex preg-replace

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

<p>
    Blah</p>
<p>
    {{{body}}}</p>
<p>
    Blah</p>
Run Code Online (Sandbox Code Playgroud)

变成这样:

<p>
    Blah</p>
{{{body}}}
<p>
    Blah</p>
Run Code Online (Sandbox Code Playgroud)

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

{{{body}}}
<p>
    Blah</p>
Run Code Online (Sandbox Code Playgroud)

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

[编辑]

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

Jos*_*ber 5

试试这个:

<[^>]+>\s*\{{3}body\}{3}\s*<\/[^>]+>
Run Code Online (Sandbox Code Playgroud)

在此处查看:http://regexr.com?30s4o

这是细分:

  • <[^>]+> 匹配一个开头的HTML标记,只有那个.
  • \s*捕获任何空白(相当于[ \t\r\n]*)
  • \{{3}{恰好匹配3次
  • body 字面上匹配字符串
  • \}{3}}恰好匹配3次
  • \s* 再次,抓住任何空白
  • <\/[^>]+> 匹配关闭的HTML标记