用于删除连续字符格式标记的正则表达式

Regex for removing consecutive character formatting tags

我需要一个正则表达式来匹配和替换包含整个段落标签的连续字符格式标签,简单 DOM Html 解析器

输入:

<p><b><i>Lorem Ipsum Content</i></b></p>

预期输出:<p>Lorem Ipsum</p>

在下面的例子中,正则表达式应该只匹配和替换 <b> 标签,因为这是唯一包含整个段落标签的标签

例如:输入:<p><b>Text <i> some more text </i>text inside </b></p>

输出:<p>Text <i> some more text </i>text inside </p>

谢谢。

不是一个优雅的,也许是部分的灵魂。

  1. Trim(剥离)input 字符串
  2. while True:
  3. <i>替换为""
  4. <b>替换为""
  5. 将etc字符标签替换为""
  6. ...
  7. 如果在步骤 3 ~ 6 中没有找到匹配项,则 break

第 3 步的正则表达式是这样的。

<p>\s*(<i>)*\s*.*(<\/i>)\s*<\/p>

对于<b>标签,将<i>替换为<b>

它将看起来像这样:

foreach($html->find('p') as $p) {
  while(preg_match('/^<([^>]+)>(.*)<\/>$/', $p->innertext, $m)){
    $p->innertext = $m[2];
  }
}

请注意,正则表达式中的 与第一个捕获组中的 html 标签名称相匹配,可能没有必要,但我这样做是为了奖励。