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

时间:2017-03-28 06:46:19

标签: php regex simple-html-dom

我需要一个正则表达式来匹配并替换简单DOM Html Parser中包含整个段落标记的连续字符格式化标签

输入:

<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>

谢谢。

2 个答案:

答案 0 :(得分:0)

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

  1. 修剪(剥离)input字符串
  2. while True:
  3. <i>替换为""
  4. <b>替换为""
  5. 将等字符标记替换为""
  6. ...
  7. 如果在步骤3~6中找不到匹配项,则break
  8. 第3步的正则表达式是这样的。

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

    对于<b>代码,请将<i>替换为<b>等。

答案 1 :(得分:0)

看起来像这样:

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

请注意,正则表达式中的\1与第一个捕获组中的html标记名称匹配,可能不是必需的,但我是为奖励而做的。