使用DOM Xpath的PHP-删除子节点并排列字符串
我有这个html结构:使用DOM Xpath的PHP-删除子节点并排列字符串,php,domxpath,Php,Domxpath,我有这个html结构: <html> <body> <section> <div> <div> <section> <div> <table> <tbody> <tr></tr>
<html>
<body>
<section>
<div>
<div>
<section>
<div>
<table>
<tbody>
<tr></tr>
<tr>
<td></td>
<td></td>
<td>
<i></i>
<div class="first-div class-one">
<div class="second-div"> soft </div>
130 cm / 15cm
</div>
</td>
</tr>
<tr></tr>
</tbody>
</table>
</div>
</section>
</div>
</div>
</section>
</body>
</html>
这让我“软130厘米/15厘米”的结果
但我只想知道如何获得“15”,因此我需要:
1。要知道如何摆脱childNode->nodeValue
2。一旦我有了“130 cm/15 cm”,我就知道如何在PHP中仅将“15”作为变量的nodeValue。
你们能帮忙吗?
提前感谢标记中的文本也是节点(子节点),尤其是
DOMText
。
通过查看该div
的子级,可以找到DOMText
并获取其nodeValue
。下面是一个例子:
$doc = new DOMDocument();
$doc->loadHTML("<html><body><p>bah</p>Test</body></html>");
echo $doc->saveHTML();
$xpath = new DOMXPath( $doc );
$nodelist = $xpath->query( '/html/body' );
foreach ( $nodelist as $node ) {
if ($node->childNodes)
foreach ($node->childNodes as $child) {
if($child instanceof DOMText)
echo $child->nodeValue."\n"; // should output "Test".
}
}
完整解决方案:
<?php
$strhtml = '
<html>
<body>
<section>
<div>
<div>
<section>
<div>
<table>
<tbody>
<tr></tr>
<tr>
<td></td>
<td></td>
<td>
<i></i>
<div class="first-div class-one">
<div class="second-div"> soft </div>
130 cm / 15cm
</div>
</td>
</tr>
<tr></tr>
</tbody>
</table>
</div>
</section>
</div>
</div>
</section>
</body>
</html>';
$doc = new DOMDocument();
@$doc->loadHTML($strhtml);
echo $doc->saveHTML();
$xpath = new DOMXPath( $doc );
$nodelist = $xpath->query( '/html/body/section/div/div/section/div/table/tbody/tr[2]/td[3]/div' );
foreach ( $nodelist as $node ) {
if ($node->childNodes)
foreach ($node->childNodes as $child) {
if($child instanceof DOMText && trim($child->nodeValue) != "")
{
echo 'Raw: '.trim($child->nodeValue)."\n";
$matches = array();
preg_match('|/ ([0-9]+) ?cm$|', trim($child->nodeValue), $matches);
echo 'Value: '.$matches[1]."\n";
}
}
}
nodeValue
只是一个文本字符串。一旦你有了这个字符串,DOM的工作就完成了——你需要使用标准的PHP字符串操作(例如substr)来操作它,然后将修改后的字符串塞回DOM中。是的,这就是为什么标题上写着“PHP with DOM xpath”。如果我只想得到“130”,我知道该怎么办,但如果我只想得到“15”,我就不知道该怎么办。此外,我首先需要删除子div的值'soft',这是一个domxpath。另外,在我正在使用的实际html代码中,围绕“15”的子字符串可能会发生变化。我要告诉您,您有130 cm/15cm
字符串,现在必须使用标准的php字符串操作来进一步分解它。这意味着从技术上讲,您的问题与dom无关。dom完成了它的工作,现在你需要其他工具。我还没有“130厘米/15厘米”。我有“软130厘米/15厘米”。请看原始问题。@MarcB,我想你还没有读到有一个值为“soft”的child div。这是我问题的第一部分。韦博德,谢谢你的帮助。您的基本示例工作正常。但这是我从代码中得到的输出:“Null”结果来自我在最后添加的var_转储。如果我删除var_转储,它不会输出任何内容。您的xpath与第一个div[2]
错误,请参阅我的编辑,我添加了完整的解决方案。如果这解决了您的问题,请不要忘记投票并选择我的答案,谢谢!
$string = "130 cm / 15cm";
$matches = array();
preg_match('|/ ([0-9]+) ?cm$|', $string, $matches);
echo $matches[1];
<?php
$strhtml = '
<html>
<body>
<section>
<div>
<div>
<section>
<div>
<table>
<tbody>
<tr></tr>
<tr>
<td></td>
<td></td>
<td>
<i></i>
<div class="first-div class-one">
<div class="second-div"> soft </div>
130 cm / 15cm
</div>
</td>
</tr>
<tr></tr>
</tbody>
</table>
</div>
</section>
</div>
</div>
</section>
</body>
</html>';
$doc = new DOMDocument();
@$doc->loadHTML($strhtml);
echo $doc->saveHTML();
$xpath = new DOMXPath( $doc );
$nodelist = $xpath->query( '/html/body/section/div/div/section/div/table/tbody/tr[2]/td[3]/div' );
foreach ( $nodelist as $node ) {
if ($node->childNodes)
foreach ($node->childNodes as $child) {
if($child instanceof DOMText && trim($child->nodeValue) != "")
{
echo 'Raw: '.trim($child->nodeValue)."\n";
$matches = array();
preg_match('|/ ([0-9]+) ?cm$|', trim($child->nodeValue), $matches);
echo 'Value: '.$matches[1]."\n";
}
}
}