php - PHP迭代html字符串的每个节点,包括被其他节点分割的文本节点
问题描述
我尝试使用 DOMDocument 和 DOMXPath 更改给定 HTML 代码的每个可读部分
$dom = new DOMDocument();
$dom->loadHTML('
<h3>
TEST_1
<b>b tag content</b>
TEST_2
</h3>
<p>p tag content </p>
');
$xpath = new DOMXPath($dom);
foreach ($xpath->evaluate('//*[count(*) = 0]') as $node) {
$node->nodeValue = "Changed " . $node->nodeValue;
}
echo $dom->saveHTML();
它给了我
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<body>
<h3>
TEST_1
<b>Changed b tag content</b>
TEST_2
</h3>
<p>Changed p tag content</p>
</body>
</html>
但是字符串“TEST_1”和“TEST_2”没有改变,因为 $xpath->evaluate('// [ count( ) = 0 ]') 只给了我没有子节点的节点。
- 如何获取具有“TEST_1”和“TEST_2”等节点的所有节点?
- 如何防止添加
<html>
和<body>
标签结果?
解决方案
不幸的是,我没有找到正确的 xpath 表达式。通过递归解决了这个问题。这有效:
function rewrite_all_nodes(&$node) {
if(count($node->childNodes) > 1){
foreach($node->childNodes as $sub_node){
change_all_nodes($sub_node);
}
} else {
if(!empty(trim($node->nodeValue))){
$node->nodeValue = "Changed";
}
}
}
为了切断<body>
和<html>
标记我发现了这个https://stackoverflow.com/a/38079328/14495402
如果您知道 xpath 样式的解决方案,请分享))
推荐阅读
- oracle - NO_DATA_FOUND 异常与 FOR 循环
- python - 学校的家庭作业不工作垃圾邮件或只是不工作
- windows-installer - 我正在.net 中进行设置和部署,我无法用较新的版本替换现有版本,需要一些指导
- html - CSS 中的微光效果
- javascript - 我有两个相同的 cIass 名称,一个样式可以为第一个 div 类应用样式?
- grpc - grpc.max_concurrent_streams 在客户端上不可用
- c# - 如何绑定到 C# wpf datagrid 视图单元格的背景?
- android - 如何在 android Bitmap 中将图像转换为 1bpp 字节数组
- laravel - 如何从 Laravel 中的集合中获取特定数组
- python - 调用 Matlab 函数可以在部署的 PyQt 应用程序中工作吗?