按顺序对数组进行排序它们是在文档中找到的 - preg_match_all

时间:2016-05-12 14:00:51

标签: php regex dom

我试图在我的php脚本中使用preg_match_all将相应的值捕获到两个单独的数组中。

离。

<p>
   <span id="calibration_test_name_0">blah blah blah</span>
   <span id="calibration_test_instrument_0">blah blah blah</span>
</p>
<p>
   <span id="calibration_test_name_1">blah blah blah</span>
   <span id="calibration_test_instrument_1">blah blah blah</span>
</p>

我正在创建两个独立的数组(一个用于测试名称,一个用于测试仪器)。我想用test_instrument_0输出test_name_0。等等,但我得到的结果是乱序的。我知道这与排序有关。无论如何要按照它们在文档中出现的顺序对这两个数组进行排序吗?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

答案:改为使用Parser。如果您拥有与乐器一样多的名称,则可以采用以下方法。

代码:

<?php

// your html
$html = <<<EOF
<p>
   <span id="calibration_test_name_0">blah blah blah</span>
   <span id="calibration_test_instrument_0">blah blah blah</span>
</p>
<p>
   <span id="calibration_test_name_1">blah blah blah</span>
   <span id="calibration_test_instrument_1">blah blah blah</span>
</p>
EOF;

// load the DOM
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);

$prefix = 'calibration_test_';
$xnames = $prefix . "name";
$xinstruments = $prefix . "instrument";

$names = iterator_to_array($xpath->query("//span[starts-with(@id, '$xnames')]"));
$instruments = iterator_to_array($xpath->query("//span[starts-with(@id, '$xinstruments')]"));

// loop over the found items
for ($i=0;$i<count($names);$i++)
    echo "Name: " . $names[$i]->nodeValue . ", Instrument: " . $instruments[$i]->nodeValue . "\n";
?>

说明:

该代码段将您的html字符串加载到DOM并对其运行两个xpath查询。这些转换为数组并在之后循环。

演示:

查看有效的demo on ideone.com

答案 1 :(得分:1)

如果您的输入是有效的xml,那么您应该使用XML解析器而不是REGEXP。该命令实际上与REGEXP有很大关系,如果您使用命名模式,您应该能够以正确的顺序检索您的内容。同样,如果您的输入是XML有效,则XML解析器会更好。