如何在 span php 中只包装单词?

How to wrap only words in spans php?

我有一个混合了 html 的文本字符串,需要将单词 分开并将它们包装在 span 中。

字符串:

$string ='<div class="something">What </div> if it it is is same <div style="color:red;">same </div>';

期望的输出

<div class="something">
  <span class="splits split1">
    What
  </span>
</div>
<span class="splits split2">
  if
</span>
<span class="splits split3">
  it
</span>
<span class="splits split4">
  it
</span>
<span class="splits split5">
  is
</span>
<span class="splits split6">
  is
</span>
<span class="splits split7">
  same
</span>
<div style="color:red;">
  <span class="splits split8">
    same
  </span>
</div>

我尝试了所有我能想到的方法,preg_replace 带单词边界,preg_match,str_replace,带爆炸、循环和替换的组合,但输出失败并制动 html 或在不应该的地方添加替换。

感谢任何帮助。

正如@MarcB 所说,DOM 生活更美好,但由于问题被标记为 这可能是一种解决方法(虽然不能保证 %100):

</?\b[^<>]+>(*SKIP)(*F)|\w+

PHP:

preg_replace_callback('~</?\b[^<>]+>(*SKIP)(*F)|\w+~', function($matches) {
    static $counter = 0;
    return "<span class=\"splits split".(++$counter)."\">{$matches[0]}</span>";
}, $string);

Live demo