给出像这样的HTML字符串:
Lorem ipsum dolor sit amet, <a href="#">consectetuer adipiscing</a>
elit, <strong>tincidunt</strong> ut volutpat.
如何使用<span>
元素包围所有单词,因此它变为:
<span>Lorem</span> <span>ipsum</span> <span>dolor</span> <span>sit</span>
<span>amet,</span> <a href="#"><span>consectetuer</span> <span>adipiscing</span></a>
<span>elit,</span> <strong><span>tincidunt</span></strong> <span>ut</span>
<span>volutpat.</span>
答案 0 :(得分:1)
更简单的方法
preg_replace('([a-zA-Z.,!?0-9]+(?![^<]*>))', '<span>$0</span>', '{{your data}}');
<span>
除了[a-zA-Z.,!?0-9]+
中的单词外,<brackets>
所有单词都包含在{{1}}中。{
现在,如果需要,似乎很容易改变你的词汇量,例如如果你不想让单个标点符号被包围等等。
答案 1 :(得分:1)
如果@ daftcoder的解决方案适合你,那很好,但如果你的代码中有实体(&amp; lt; etc),它确实会失败。我找不到任何失败的案例。
如果重要,可以在PHP中使用DOM操作。我知道这更复杂,但它应该比简单的正则表达式更多的情况下工作。
walk和doReplace函数从JS转换为PHP,从另一个问题的答案。 (Surrounding individual words inside HTML text with SPAN tags?)
<?php
echo wrap_words('span', 'Lorem ipsum dolor sit amet, <a href="#">consectetuer adipiscing</a> elit, <strong>tincidunt</strong> ut volutpat.');
function wrap_words($tag, $text) {
$document = new DOMDocument();
$fragment = $document->createDocumentFragment();
$fragment->appendXml($text);
walk($tag, $fragment);
$html = $document->saveHtml($fragment);
// using saveHTML with a documentFragment can leave an invalid "<>"
// at the beginning of the string - remove it
return preg_replace('/^<>/', '', $html);
}
function walk($tag, $root)
{
if ($root->nodeType == XML_TEXT_NODE)
{
doReplace($tag, $root);
return;
}
$children = $root->childNodes;
for ($i = $children->length - 1; $i >= 0; $i--)
{
walk($tag, $children->item($i));
}
}
function doReplace($tag, $text)
{
$fragment = $text->ownerDocument->createDocumentFragment();
$fragment->appendXML(preg_replace('/\S+/', "<{$tag}>\$0</{$tag}>", $text->nodeValue));
$parent = $text->parentNode;
$children = $fragment->childNodes;
for ($i = $children->length - 1; $i >= 0; $i--)
{
$parent->insertBefore($children->item($i), $text->nextSibling);
}
$parent->removeChild($text);
}
答案 2 :(得分:0)
我试过这个,认为这就是你要找的东西:
$result = preg_replace("/(<[^>]+>)?\\w*/us", "<span>$0</span>", $searchText);
这是输入
Lorem ipsum dolor sit amet, <a href="#">consectetuer adipiscing</a>elit, <strong>tincidunt</strong> ut volutpat.
这是输出
<span>Lorem</span> <span>ipsum</span> <span>dolor</span> <span>sit</span> <span>amet</span>, <span><a href="#">consectetuer</span> <span>adipiscing</span><span></a></span><span>elit</span>, <span><strong>tincidunt</span><span></strong></span> <span>ut</span> <span>volutpat</span>.