如何使用PHP正则表达式使用单个span标记替换具有相同类名的多个span标记

时间:2017-04-26 11:54:34

标签: php regex preg-replace

我必须使用PHP正则表达式将具有相同类名的所有span标记替换为单个span标记。我知道我们可以通过使用DOMDocument以及使用javascript / jQuery来实现这一点。我也尝试使用下面的代码,但它的关闭。

[<span(.*)><strong>*](.*)<\/strong><\/span>

以下是我所指的代码。

<span class="c28"><strong><span class=
  "c28"><strong><span class="c28"><strong><span class=
  "c28"><strong><span class="c28"><strong><span class=
  "c28"><strong><span class="c28"><strong><span class=
  "c28"><strong><span class="c28"><strong><span class=
  "c28"><strong><span class="c28"><strong><span class=
  "c28"><strong><span class="c28"><strong><span class=
  "c28"><strong><span class="c28"><strong><span class=
  "c28"><strong><span class="c28"><strong><span class=
  "c28"><strong><span class="c28"><strong><span class=
  "c28"><strong>Sending text messages that include links,
  attachments and/or
  pictures.</strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span></strong></span>

我希望输出像

<span class="c28"><strong>Sending text messages that include links, attachments and/or pictures.</strong></span>

任何人都可以帮我解决这个正则表达式。感谢

2 个答案:

答案 0 :(得分:0)

在这种情况下,您可以利用非空 <strong>文本内容定位的事实 - 这意味着您可以使用这个相当简单的模式:

正则表达式:.*?class="(\w+)".*(<strong>[^<]+<\/strong>).*

替换:<span class="$1">$2</span>

https://regex101.com/r/mtUBWx/2/

答案 1 :(得分:0)

应避免使用嵌套strong。嵌套的span也是如此,不管它们的类名是什么,它们会立即出现在另一个之后,表明滥用HTML实现。你可以选择:

(</?\w+[^>]*>)(?1)*\1

Live demo

PHP代码:

preg_replace('~(</?\w+[^>]*>)(?1)*\1~', '\\1', $string);