将 HTML 标记包裹在 HTML 代码中的字符串周围



我正在使用PHP 7.3+。我想在我的 HTML 代码中的每个字母周围包装不同的 HTML 标签,但只包裹在文本周围,而不是其他 HTML 标签。例如:

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>The HTML5 Herald</title>
<meta name="description" content="The HTML5 Herald">
<meta name="author" content="SitePoint">
<link rel="stylesheet" href="css/styles.css?v=1.0">
</head>
<body>
<h1>This is the first heading</h1>
<p>Some Paragraph</p>
<ul>
<li>List item 1</li>
<li>List item 2</li>
</ul>
<script src="js/scripts.js"></script>
</body>
</html>

我基本上想<span class="customclass"></span>包裹网站文本的每个字母。它们是:

This is the first heading
Some Paragraph
List item 1
List item 2

以下是预期的输出:

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>The HTML5 Herald</title>
<meta name="description" content="The HTML5 Herald">
<meta name="author" content="SitePoint">
<link rel="stylesheet" href="css/styles.css?v=1.0">
</head>
<body>
<h1><span class="customclass">T</span><span class="customclass">h</span><span class="customclass">i</span><span class="customclass">s</span> <span class="customclass">i</span><span class="customclass">s</span> <span class="customclass">t</span><span class="customclass">h</span><span class="customclass">e</span> <span class="customclass">f</span><span class="customclass">i</span><span class="customclass">r</span><span class="customclass">s</span><span class="customclass">t</span> <span class="customclass">h</span><span class="customclass">e</span><span class="customclass">a</span><span class="customclass">d</span><span class="customclass">i</span><span class="customclass">n</span><span class="customclass">g</span></h1>
<p><span class="customclass">S</span><span class="customclass">o</span><span class="customclass">m</span><span class="customclass">e</span> <span class="customclass">P</span><span class="customclass">a</span><span class="customclass">r</span><span class="customclass">a</span><span class="customclass">g</span><span class="customclass">r</span><span class="customclass">a</span><span class="customclass">p</span><span class="customclass">h</span></p>
<ul>
<li><span class="customclass">L</span><span class="customclass">i</span><span class="customclass">s</span><span class="customclass">t</span> <span class="customclass">i</span><span class="customclass">t</span><span class="customclass">e</span><span class="customclass">m</span> <span class="customclass">1</span></li>
<li><span class="customclass">L</span><span class="customclass">i</span><span class="customclass">s</span><span class="customclass">t</span> <span class="customclass">i</span><span class="customclass">t</span><span class="customclass">e</span><span class="customclass">m</span> <span class="customclass">2</span></li>
</ul>
<script src="js/scripts.js"></script>
</body>
</html>

我有这个正则表达式,但它只包裹在最后 2 个单词周围,我需要的是每个字母:

preg_replace('/b[w'-]+W+K.*S/s', '<span class="customclass">$0</span>', $html);

这在 PHP 中是如何实现的?

此代码获取 HTML 文档的正文,然后递归查找元素和这些元素中的文本。如果找到任何内容,它将每个字母包装在 span 标记中。

这支持自定义标记,并且仅影响文档<body>中的 HTML。

$string ='<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>The HTML5 Herald</title>
<meta name="description" content="The HTML5 Herald">
<meta name="author" content="SitePoint">
<link rel="stylesheet" href="css/styles.css?v=1.0">
</head>
<body>
<h1>This is the first heading</h1>
<p>Some Paragraph</p>
<ul>
<li>List item 1</li>
<li>List item 2</li>
</ul>
<script src="js/scripts.js"></script>
</body>
</html>';

$previous_value = libxml_use_internal_errors(TRUE);
$dom = new DOMDocument();
$dom->loadHTML($string);
$body = $dom->getElementsByTagName('body')->item(0);
foreach ($body->getElementsByTagName('*') as $element) {
replaceText($element);
}
$html = html_entity_decode($dom->saveHTML());
libxml_clear_errors();
libxml_use_internal_errors($previous_value);
function replaceText(DOMNode $node) {
if ($node instanceof DOMText) {
$newString = '';
foreach(str_split($node->nodeValue) as $char) {
if (!trim($char)) {
continue;
}
$newString .= sprintf('<span class="customclass">%s</span>', $char);
}
$node->nodeValue = $newString;
return $node;
}
if ($node->hasChildNodes()) {
foreach($node->childNodes as $childNode) {
return replaceText($childNode);
}
}
}

输出:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>The HTML5 Herald</title>
<meta name="description" content="The HTML5 Herald">
<meta name="author" content="SitePoint">
<link rel="stylesheet" href="css/styles.css?v=1.0">
</head>
<body>
<h1><span class="customclass">T</span><span class="customclass">h</span><span class="customclass">i</span><span class="customclass">s</span><span class="customclass">i</span><span class="customclass">s</span><span class="customclass">t</span><span class="customclass">h</span><span class="customclass">e</span><span class="customclass">f</span><span class="customclass">i</span><span class="customclass">r</span><span class="customclass">s</span><span class="customclass">t</span><span class="customclass">h</span><span class="customclass">e</span><span class="customclass">a</span><span class="customclass">d</span><span class="customclass">i</span><span class="customclass">n</span><span class="customclass">g</span></h1>
<p><span class="customclass">S</span><span class="customclass">o</span><span class="customclass">m</span><span class="customclass">e</span><span class="customclass">P</span><span class="customclass">a</span><span class="customclass">r</span><span class="customclass">a</span><span class="customclass">g</span><span class="customclass">r</span><span class="customclass">a</span><span class="customclass">p</span><span class="customclass">h</span></p>
<ul>
<li><span class="customclass">L</span><span class="customclass">i</span><span class="customclass">s</span><span class="customclass">t</span><span class="customclass">i</span><span class="customclass">t</span><span class="customclass">e</span><span class="customclass">m</span><span class="customclass">1</span></li>
<li><span class="customclass">L</span><span class="customclass">i</span><span class="customclass">s</span><span class="customclass">t</span><span class="customclass">i</span><span class="customclass">t</span><span class="customclass">e</span><span class="customclass">m</span><span class="customclass">2</span></li>
</ul>
<script src="js/scripts.js"></script>
</body>
</html>

最新更新