PHP在一个特定的html div上使用str_replace [重复]。

问题描述 投票:0回答:1

我们希望给标点符号增加一些毛线间距,以改善网页排版的外观。 添加发际线间距来改变 (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'> 是在主部门内。

这个问题不是另一个问题的重复,另一个问题是关于提取信息。 这个问题是关于修改网页中的单个字母字符。

php preg-replace str-replace
1个回答
0
投票

你需要做的是将你的文档加载到 DOMDocument,然后选择您的 <div id="main"> 元素,并替换其中的文本。

类似这样

$find = ['(', ')', '?', '!']; // characters to find
$replace = ['(&#8202;', '&#8202;)', '&#8202;?', '&#8202;!']; // 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

© www.soinside.com 2019 - 2024. All rights reserved.