【问题标题】:PHP clear up Array preg_grepPHP 清除数组 preg_grep
【发布时间】:2017-05-07 13:38:46
【问题描述】:

我目前在 php 中遇到了数组问题, 我从一个 html 网站请求了所有 <li> 标签:

$dochtml = new DOMDocument();
$dochtml -> loadHTMLFile("my.html");

/*get all li’s*/
$lis = $dochtml -> getElementsByTagName('li');

我的 HTML 正文:

<li>gfvgvefg</li>
<li>ferfergegeg</li>
<li id="vdfvdfvf"></li>
<li id="id_1"> My Value 1</li>
<li id="id_2"> My Value 2</li>
<li id="id_3"> My Value 3</li>
<li id="id_4"> My Value 4</li>
<li></li>
<li id="efgvefgvfg">gfegvefgbv</li>

然后我从我的&lt;li&gt; 标签中回显所有 id 和值:

    foreach($lis as $key) {

        $id = $key -> getAttribute('id');
        $value = $key -> nodeValue;

        echo $id. ' - '.$value.'<br>';

    }

输出:

0 - gfvgvefg
0 - ferfergegeg
vdfvdfvf - 0
id_1 - My Value 1
id_2 - My Value 2
id_3 - My Value 3
id_4 - My Value 4 
0 - 0
efgvefgvfg - gfegvefgbv

您会看到一些 id 是 0,值也是。

我想要的是这个输出(print_r):

Array ( [id_1] => My Value 1
     [id_2] => My Value 2
     [id_3] => My Value 3
    [id_4] => My Value 4)

所以只有带有 id_* 和正确值的 id 在一个数组中。

我试试这个:

foreach($lis as $key) {
    // gets, and outputs the ID and content of each DIV
    $id = $key -> getAttribute('id');
    $value = $key -> nodeValue;

    //echo $id. ' - '.$value.'<br>';


    $array = array($value => $id);
    $matches  = preg_grep('/^id_(\w+)/i', $array);
    print_r($matches);
}

但我得到了这个输出(print_r):

Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( )

no id 没有价值,什么都没有。 我知道我可以通过 preg_grep 使用 array_keys,但是我只得到了 id 和空数组……

这是一个在线编译的代码,以便更好地理解。

Code Online Compiled

请帮帮我。

【问题讨论】:

    标签: php html arrays preg-match preg-grep


    【解决方案1】:

    同样使用 XPath:

    $dom =new DOMDocument;
    $dom->loadHTMLFile("my.html");
    $xp = new DOMXPath($dom);
    
    $nodeList = $xp->query('//li[starts-with(@id, "id_")]');
    
    foreach ($nodeList as $node) {
        $result[$node->getAttribute('id')] = $node->nodeValue;
    }
    
    print_r($result);
    

    【讨论】:

      【解决方案2】:

      在一个 foreach 中完成所有操作:

      $arrLis = array();
      foreach($lis as $key) {
      
          $id = $key -> getAttribute('id');
      
          // check if `id` starts with `id_` string
          if (strpos($id, 'id_') === 0) {
              $value = $key -> nodeValue;
      
              echo $id. ' - '.$value.'<br>';
      
              $arrLis[$id] = $value;
          }
      }
      
      print_r($arrLis);
      

      【讨论】:

      • 好吧,现在我的输出是 Array ( [id_1] =&gt; My Value 1 [id_2] =&gt; My Value 2 [id_3] =&gt; My Value 3 [id_4] =&gt; My Value 4 [efgvefgvfg] =&gt; gfegvefgbv ),但我现在如何实现 preg_grep 函数只得到 Array ( [id_1] =&gt; My Value 1 [id_2] =&gt; My Value 2 [id_3] =&gt; My Value 3 [id_4] =&gt; My Value 4 ).... 通配符:id_*
      • 嘿,非常酷,谢谢!还有一个问题,strpos 比 preg_grep 更好吗?
      • 在你的情况下是这样。因为使用strpos,您只需执行 one 操作 - 检查字符串中的子字符串,而使用 preg_grep 您可以执行多个操作 - 创建数组,然后运行 ​​preg_grep,这将在底层进行迭代大批。那么为什么要做几个动作而不是一个呢?
      猜你喜欢
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多