【问题标题】:How to wrap only words in spans php?如何只在spans php中包装单词?
【发布时间】:2016-10-06 21:32:27
【问题描述】:

我有一个与 html 混合的文本字符串,并且需要分隔单词 only 并将它们包装在跨度中。

字符串:

$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 with word boundary, preg_match, str_replace, combos with explodes, loops and replace,但是输出失败并在不应该出现的地方添加了替换。

感谢任何帮助。

【问题讨论】:

  • 您忘记了为此设计的一个工具:DOM。一旦你用 dom 提取了你的单个 html 节点,那么你就可以处理文本节点并将它们转换为 html。
  • @MarcB 你是对的,如果你有时间展示一个例子会很棒。

标签: php regex preg-replace


【解决方案1】:

正如@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

【讨论】:

  • 正在测试,但看起来你成功了。
猜你喜欢
  • 2016-08-28
  • 2011-04-24
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多