PHP清除数组preg_grep

PHP清除数组preg_grep,php,html,arrays,preg-match,preg-grep,Php,Html,Arrays,Preg Match,Preg Grep,我目前在php中遇到数组问题, 我从一个html站点请求了所有标记,其中包含: $dochtml = new DOMDocument(); $dochtml -> loadHTMLFile("my.html"); /*get all li’s*/ $lis = $dochtml -> getElementsByTagName('li'); 我的Html正文: <li>gfvgvefg</li> <li>ferfergegeg</li>

我目前在php中遇到数组问题, 我从一个html站点请求了所有
  • 标记,其中包含:

    $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>
    
    您可以看到一些id为0,也有值

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

    因此,在一个数组中,只有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);
    }
    
    没有id,没有价值,什么都没有。 我知道我可以通过preg_grep使用array_键,但是我只得到id和空数组

    以下是在线编译中的代码,以便更好地理解


    请帮帮我。

    一次完成每件事

    $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);
    
    $arrLis=array();
    foreach($lis作为$key){
    $id=$key->getAttribute('id');
    //检查'id'是否以'id.'字符串开头
    if(strpos($id,'id')==0){
    $value=$key->nodeValue;
    回显$id.-'.$value.
    '; $arrLis[$id]=$value; } } 印刷费($arrLis);
    使用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);
    

    好了,现在我的输出是
    Array([id\u 1]=>my value1[id\u 2]=>my value2[id\u 3]=>my value3[id\u 4]=>my value4[efgvegvfg]=>gfegvefgbv)
    但是我现在如何实现preg\u grep函数来只获取
    Array([id\u 1]=>my value1[id\u 2]=>my value2[id\u 3]=>my value3[id\u 4]=>my value4]=>my value4)
    。。。。通配符:嘿,很酷,谢谢!!还有一个问题,strpos作为preg_grep更好吗?在你的例子中是这样的。因为使用
    strpos
    只需执行一个操作-检查字符串中的子字符串,使用
    preg_grep
    执行多个操作-创建数组,然后运行
    preg_grep
    ,该操作在引擎盖下将在数组上迭代。那么,为什么要做几个动作而不是一个呢?
    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);
    }
    
    Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( )
    
    $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);
    
    $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);