Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用XPath将dom内容正确分类到数组中_Php_Xpath - Fatal编程技术网

Php 使用XPath将dom内容正确分类到数组中

Php 使用XPath将dom内容正确分类到数组中,php,xpath,Php,Xpath,HTML示例: <div class"classX"> <a href="#" class="aClass">Link Text 1</a> <span class="sClass"><p>Text #1</p></span> </div> <div class="classX"> <a href="#" class="aClass">Link Text 2</a>

HTML示例:

<div class"classX">
<a href="#" class="aClass">Link Text 1</a>
<span class="sClass"><p>Text #1</p></span>
</div>

<div class="classX">
<a href="#" class="aClass">Link Text 2</a>
</div>

<div class="classX">
<a href="#" class="aClass">Link Text 3</a>
</div>

<div class="classX">
<a href="#" class="aClass">Link Text 4</a>
<span class="sClass"><p>Text #4</p></span>
</div>

<div class="classX">
<a href="#" class="aClass">Link Text 5</a>
<span class="sClass"><p>Text #5</p></span>
</div>
但是使用带有
$key
值的
foreach
循环对输出进行了错误的组织,我得到的数组如下所示:

 [0] => Array
        (
            [link_text] => Link Text 1
            [span_text] => Text #1
        )

    [1] => Array
        (
            [link_text] => Link Text 2
            [span_text] => Text #4
        )

    [2] => Array
        (
            [link_text] => Link Text 3
            [span_text] => Text #5
        )

    [3] => Array
        (
            [link_text] => Link Text 4
        )

    [4] => Array
        (
            [link_text] => Link Text 5
        )
我完全理解为什么会发生这种情况,这是因为我在访问
span\u text
值时使用了
link\u text
键,但我不知道如何正确构建具有正确组合的数组

PHP:

$finder=newdomxpath($dom);
$link_text=$finder->query(//a[contains(@class,normalize space('aClass'))]);
$span_text=$finder->query(//span[contains(@class,'sClass')]/@datahtml);
foreach($key=>$link\u文本作为$key){
if(空($span_text[$key]->textContent)){
$link\u text=trim($link\u text->textContent);
$dataArr[]=str\u replace(“\n”,”,$link\u text);
$data[]=数组(“链接文本”=>str\u替换(“\n”,”“,$link\u text));
}否则{
$span_text=str_replace(“\n”,”,$span_text[$key]->textContent);
$span\u text=preg\u replace(“~]*>”,“,$span\u text);
$link\u text=trim($link\u text->textContent);
$data[]=数组(“链接文本”=>str\u替换(“\n”,”,$link\u text),“span\u文本”=>$span\u文本);
}
}

我认为从选择所有父
元素开始会更容易。然后我们可以为每个
div
选择嵌套的
a
span
元素

$finder = new DomXPath($dom);
$divs = $finder->query("//div[@class='classX']");
$data = array();

foreach($divs as $div) {
    $link = $finder->query("./a[@class='aClass']", $div)->item(0);
    $span = $finder->query("./span[@class='sClass']", $div)->item(0);
    $items = array(
        "link_text" => $link ? $link->textContent : null, 
        "span_text" => $span ? $span->textContent : null
    );
    $data[] = array_filter($items);
}

print_r($data);
这将生成一个
$data
数组,其中所有
link\u text
span\u text
项的顺序正确

空值由
array\u filter
删除,因此某些嵌套数组没有
span\u text
键。

如果需要恒定数量的项目,那么不要输入
$items
数组。

这是个好主意。有没有办法避免
注意:在运行
$finder->query(“./span[@class='sClass']”,$div)->item(0)->textContent时尝试获取非对象的属性
错误?也许通过一个
if
语句来检查这个查询是否返回NULL?不管怎样,我已经找到了我所需要的:
if(!empty($finder->query(./span[@class='sClass'],$div)->item(0)->textContent))
。谢谢我通过检查NULL项更新了代码,因此PHP不会抛出任何警告。
$finder = new DomXPath($dom);
$link_texts= $finder->query("//a[contains(@class, normalize-space('aClass'))]");
$span_text= $finder->query("//span[contains(@class,'sClass')]/@data-html");


foreach ($link_texts as $key => $link_text) {

    if (empty($span_text[$key]->textContent)) {
        $link_text = trim($link_text->textContent);
        $dataArr[] = str_replace("\n", " ", $link_text);
        $data[] = array("link_text"=>str_replace("\n", " ", $link_text));
    } else {
        $span_text = str_replace("\n", " ", $span_text[$key]->textContent);
        $span_text = preg_replace('~</?p[^>]*>~', '', $span_text);
        $link_text = trim($link_text->textContent);
        $data[] = array("link_text"=>str_replace("\n", " ", $link_text), "span_text"=>$span_text);
    }

}
$finder = new DomXPath($dom);
$divs = $finder->query("//div[@class='classX']");
$data = array();

foreach($divs as $div) {
    $link = $finder->query("./a[@class='aClass']", $div)->item(0);
    $span = $finder->query("./span[@class='sClass']", $div)->item(0);
    $items = array(
        "link_text" => $link ? $link->textContent : null, 
        "span_text" => $span ? $span->textContent : null
    );
    $data[] = array_filter($items);
}

print_r($data);