我有以下html结构
<span class="x">a</span>
<br>
• first
<br>
• Second
<br>
• second
<br>
• third
<br>
<br>
<span class="x">b</span>
我需要获得跨度节点之间出现的所有文本值(以逗号分隔),即第一,第二,第二,第三
如何使用xpath,dom
完成此操作答案 0 :(得分:3)
您可以使用XPath查询这些元素,但需要在PHP中“清理”这些项目符号,因为SimpleXML仅支持XPath 1.0而没有扩展的字符串编辑功能。
最重要的是XPath表达式,我将详细解释:
//span[text()='a']/following::text()
:在内容为“a”的范围内获取所有文本节点 [. = //span[text()='b']/preceding::text()]
在内容为“b”这是完整的代码,您可能需要投入更多精力来消除要点。确保PHP将其评估为UTF-8,否则您将获得Mojibake而不是项目符号。
<?php
$html = '
<span class="x">a</span>
<br>
• first
<br>
• Second
<br>
• second
<br>
• third
<br>
<br>
<span class="x">b</span></wrap>
';
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->strictErrorChecking = false;
$dom->recover = true;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$results = $xpath->query("//span[text()='a']/following::text()[. = //span[text()='b']/preceding::text()]");
foreach ($results as $result) {
$token = trim(str_replace('•', '', $result->nodeValue));
if ($token) $tokens[] = $token;
}
echo implode(',', $tokens);
?>
答案 1 :(得分:1)
您的html结构<br>
后跟项目符号点可轻松转换为无序列表<ul></ul>
,而无需更改页面布局。
然后,您可以选择所有列表项<li></li>
的文本,并使用逗号分隔它们。我已经添加了一个示例in this jsFiddle。
要获得此文本,您可以使用:
var nodes = $('ul > li').map(function() {
return $(this).text();
}).toArray().join(",");
其中nodes
是字符串'first,Second,second,third'
。