PHP preg_match_all在preg_match_all中搜索(2次)

时间:2016-11-21 12:46:26

标签: php foreach preg-match-all

我的英语不好。

我正在尝试在preg_match中进行preg_match!

我明白了:

if( preg_match_all('~<td class="fluctuation">\s*(.*?)\s*</td>~si', $input, $item_updown_select ) );

如果我var_dump它,我明白了:

array(2) {
  [0]=>
  array(32) {
    [0]=>
    string(153) "<td class="fluctuation">
                    <span class="down"><span class="icon"></span>13.31%</span>
                </td>"
    [1]=>
    string(150) "<td class="fluctuation">
                    <span class="up"><span class="icon"></span>3.45%</span>
                </td>"
    [2]=>
    string(150) "<td class="fluctuation">
                    <span class="up"><span class="icon"></span>4.56%</span>
                </td>"
    [3]=>
    string(151) "<td class="fluctuation">
                    <span class="up"><span class="icon"></span>10.07%</span>
                </td>"

}
  [1]=>
  array(32) {
    [0]=>
    string(58) "<span class="down"><span class="icon"></span>13.31%</span>"
    [1]=>
    string(55) "<span class="up"><span class="icon"></span>3.45%</span>"
    [2]=>
    string(55) "<span class="up"><span class="icon"></span>4.56%</span>"
    [3]=>
    string(56) "<span class="up"><span class="icon"></span>10.07%</span>"
  }
}

现在我想从这个数组只有这个类!

如果我这样做,我知道它有效:

if( preg_match_all('~<span class="\s*(.*?)\s*"><span class~si', $item_updown_select[1][0], $item_updown0 ) );
if( preg_match_all('~<span class="\s*(.*?)\s*"><span class~si', $item_updown_select[1][1], $item_updown1 ) );
if( preg_match_all('~<span class="\s*(.*?)\s*"><span class~si', $item_updown_select[1][2], $item_updown2 ) );
if( preg_match_all('~<span class="\s*(.*?)\s*"><span class~si', $item_updown_select[1][3], $item_updown3 ) );

但是,如果我有超过3项,那就是编码错误!

你知道更好的方法吗?

我现在谷歌约8个小时,并没有想到。

我已经尝试过foreach:

foreach($item_updown_select[1] as $index => $text_to_draw) {
    if( preg_match_all('~<span class="\s*(.*?)\s*"><span class~si', $text_to_draw, $item_updown ) );
    print_r( $item_updown );
}

这就是我的输出:

Array
(
    [0] => Array
        (
            [0] => <span class="down"><span class
        )

    [1] => Array
        (
            [0] => down
        )

)
Array
(
    [0] => Array
        (
            [0] => <span class="up"><span class
        )

    [1] => Array
        (
            [0] => up
        )

)
Array
(
    [0] => Array
        (
            [0] => <span class="down"><span class
        )

    [1] => Array
        (
            [0] => down
        )

)

我对foreach的问题是:我如何能够分别显示每个阵列?

我不知道foreach是否是正确的方法。

我希望你了解我并知道我想要什么。

我希望你能帮助我!!

2 个答案:

答案 0 :(得分:0)

通常,我建议不要使用正则表达式来解析HTML as noted in a previous reply

然而,对于这种相当有限的用途,我认为你可能会侥幸逃脱。请注意这样一个事实:如果基础HTML发生变化,或者与上面的示例不同,这将不再起作用

// If you _only_ need the class:
$pattern = '~<td class="fluctuation">\s*<span class="([^"]+).*?</td>~si';

// If you need the class as well:
$pattern = '~<td class="fluctuation">\s*(<span class="([^"]+).*?)\s*</td>~si';

if( preg_match_all($pattern, $input, $item_updown_select ) );

第一个RegEx将只为您提供课程$matches[1],而第二个将为您提供$matches[2]中的课程。

我想强烈建议学习DOMdocument,因为这样可以更轻松地使用HTML,并且更容易修改。您可以从following tutorial开始。

答案 1 :(得分:0)

使用DOMDocument解析HTML:

$html = <<<EOD
  <table>
    <tr>
      <td class="fluctuation">
        <span class="down"><span class="icon"></span>13.31%</span>
      </td>
      <td class="fluctuation">
        <span class="up"><span class="icon"></span>3.45%</span>
      </td>
      <td class="fluctuation">
        <span class="up"><span class="icon"></span>4.56%</span>
      </td>
      <td class="fluctuation">
        <span class="up"><span class="icon"></span>10.07%</span>
      </td>
    </tr>
  </table>
EOD;

$dom = new DOMDocument();
$dom->loadHTML($html);
$finder = new DomXPath($dom);
$nodes = $finder->query("//td[@class='fluctuation']");

$classes = array();
foreach($nodes as $node) {
    foreach($finder->query("span", $node) as $span) {
        $class = $span->getAttribute('class');
        $classes[] = $class;
    }

}
print_r($classes);

<强>输出:

Array
(
    [0] => down
    [1] => up
    [2] => up
    [3] => up
)