如何在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生活更美味,但由于问题被标记为regex,这可能是一个变通方法(虽然不能保证%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);

现场演示