迭代xpath求值返回

时间:2017-11-01 14:35:37

标签: php xpath

正确的方法是如何通过xpath->evaluate来回复所有元素的回复?

我有这样的结构:

<?
$html = '
<div class="xGh" style="background-image: url(\'name_file0.jpg\');"></div>
<div class="xGh" style="background-image: url(\'name_file1.jpg\');"></div>
<div class="xGh" style="background-image: url(\'name_file2.jpg\');"></div>
<div class="xGh" style="background-image: url(\'name_file3.jpg\');"></div>
';

libxml_use_internal_errors(true);
$dom = new domDocument('1.0', 'utf-8'); 
$dom->loadHTML($html); 
$dom->preserveWhiteSpace = false; 
$xpath = new DOMXPath($dom);

$img = $xpath->evaluate('substring-before(substring-after(//div[@class=\'xGh\']/@style, "background-image: url(\'"), "\')")');    

echo $img;//name_file0.jpg

修改

使用该循环可以迭代我的对象,但不是正确的结果:

<?
$html = '
<div class="xGh" style="background-image: url(\'name_file0.jpg\');"></div>
<div class="xGh" style="background-image: url(\'name_file1.jpg\');"></div>
<div class="xGh" style="background-image: url(\'name_file2.jpg\');"></div>
<div class="xGh" style="background-image: url(\'name_file3.jpg\');"></div>
';

libxml_use_internal_errors(true);
$dom = new domDocument('1.0', 'utf-8'); 
$dom->loadHTML($html); 
$dom->preserveWhiteSpace = false; 
$xpath = new DOMXPath($dom);

$items = $xpath->query('//div[@class="xGh"]');
for($i = 0; $i < $items->length; $i++)
{   $ci = $xpath->evaluate("substring-before(substring-after(//*[@class=\"xGh\"]/@style, \"background-image: url('\"), \"')\")");
echo $ci;
}//name_file0.jpgname_file0.jpgname_file0.jpgname_file0.jpg

所需的输出是:

name_file0.jpgname_file1.jpgname_file2.jpgname_file3.jpg

将一个计数迭代器放在该循环中的正确位置在哪里,以使序列文件不相同?

如何迭代返回其他人?

2 个答案:

答案 0 :(得分:1)

我们试试这个:

register

答案 1 :(得分:0)

substring-after()substring-before()是Xpath字符串函数。如果第一个参数是位置路径,则它们会将节点列表结果强制转换为字符串。这意味着它将返回列表中第一个节点的文本内容,如果列表为空,则返回空字符串。

DOMXpath::evaluate()的返回值取决于表达式。如果表达式是位置路径,则它将是节点列表。如果使用字符串函数或运算符,它可能是标量。 DOMXpath::query()不支持这种表达方式。

通常,您需要一个位置路径表达式来迭代节点,然后使用节点作为上下文来使用DOM节点方法/属性和详细表达式。

@ daniel -o使用了DOMNode::$nodeValue并在PHP中使用了PCRE。这是更简单的解决方案,但它也适用于Xpath。

$attributes = $xpath->evaluate('//div[@class=\'xGh\']/@style');
/* @var DOMAttr $style */
foreach ($attributes as $style) {
  $url = $xpath->evaluate(
    'substring-before(substring-after(., "background-image: url(\'"), "\')")', 
    $style
  );
  var_dump($url); 
}
相关问题