我们希望给标点符号增加一些毛线间距,以改善网页排版的外观。 添加发际线间距来改变 (what)
到 ( what )
似乎很直接的使用str_replace,多次覆盖四个主要的标点符号。
str_replace("(", "( ", $content);
str_replace(")", " )", $content);
str_replace("?", " ?", $content);
str_replace("!", " !", $content);
但我们需要将替换过程限制在主div内的内容。<div id="main">bla (bla) bla</div>
作为目标标点符号 ( ? ! )
也被该页面的CSS、JS等使用。
在应用空格插入之前,页面会被最小化,所以注释、换行符等都会被剥离出来,不需要担心。
有没有办法只针对内容字符串的某一部分?
第二个关注点是如何避免针对 ?
的链接网址内的项目? 基本上是想忽略一个 <a href=url'>
是在主部门内。
这个问题不是另一个问题的重复,另一个问题是关于提取信息。 这个问题是关于修改网页中的单个字母字符。
你需要做的是将你的文档加载到 DOMDocument
,然后选择您的 <div id="main">
元素,并替换其中的文本。
类似这样
$find = ['(', ')', '?', '!']; // characters to find
$replace = ['( ', ' )', ' ?', ' !']; // replacements
// create a "text-contains" selector for all the characters
$selector = implode(' or ', array_map(function($char) {
return sprintf('contains(text(), "%s")', $char);
}, $find));
// create an XPath query to get the text nodes
$query = sprintf('//div[@id="main"]//*[%s]/text()', $selector);
$doc = new DOMDocument();
$doc->loadHTML($content);
$xpath = new DOMXPath($doc);
$elements = $xpath->query($query);
foreach ($elements as $element) {
// You need to decode the entities when working directly with text nodes
$element->nodeValue = html_entity_decode(str_replace($find, $replace, $element->nodeValue));
}
$newContent = $doc->saveHTML();
示范 ~ https:/3v4l.orgQ0fsn
见本帖 html_entity_decode()
注意事项 ~ PHP中的DOM。解码实体和设置nodeValue