![](/img/trans.png)
[英]Wrap html <a> tag around a twitter username in a tweet with php
[英]Wrap HTML Tag around strings in HTML code
我正在使用 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
這是預期的 output:
<!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>
我有這個正則表達式,但它只是把它包裹在最后兩個詞上,我需要的是每個字母:
preg_replace('/\b[\w\'-]+\W+\K.*\S/s', '<span class="customclass">$0</span>', $html);
PHP 怎么可能?
此代碼獲取 HTML 文檔的正文,然后遞歸查找元素和這些元素中的文本。 如果找到,它將每個字母包裝在一個跨度標簽中。
這支持自定義標簽,並且只影響文檔<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);
}
}
}
Output:
<!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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.