代码之家  ›  专栏  ›  技术社区  ›  Steve

PHP将html标记值从字符串提取到数组中

  •  0
  • Steve  · 技术社区  · 7 年前

    我试图从字符串中提取每个html标记的值到数组中。这是我的str值:

    str = '<li><a href="/somelink1">name1</a></li><li><a href="/somelink2">name2</a></li><li><a href="/somelink3">name3</a></li>'
    

    我想提取每个名称(name1、name2、name3)并将其放入数组中。所以输出应该是:

    output = Array(
               [0] => 'name1',
               [1] => 'name2',
               [2] => 'name3'
             )
    

    4 回复  |  直到 7 年前
        1
  •  4
  •   splash58    7 年前

    你可以使用html解析器来实现

    $dom = new DomDocument();
    $dom->loadHTML($str);
    
    $lis = [];
    foreach($dom->getElementsByTagName('li') as $li) {
        $lis[] =  $li->nodeValue;
    }
    
    print_r($lis); // Array ( [0] => name1 [1] => name2 [2] => name3 )
    
        2
  •  1
  •   A l w a y s S u n n y    7 年前

    有多种方法可以做到这一点 preg_match_all()

    <?php
    $re = '/<a ?.*?>([^<]+)<\/a>/m';
    $str = '<li><a href="/somelink1">name1</a></li><li><a href="/somelink2">name2</a></li><li><a href="/somelink3">name3</a></li>';
    $result = [];
    preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
    
    // Print the entire match result
    foreach($matches as $match){
        $result[] = $match[1];
    }
    print '<pre>';
    print_r($result);
    

    输出:

    Array ( 
      [0] => name1 
      [1] => name2 
      [2] => name3 
    )
    

    https://3v4l.org/B7k58

    正则表达式 : https://regex101.com/r/HPDhtA/1

        3
  •  0
  •   adaptable.services    7 年前

    实际上@splash58的答案是正确的,但如果我没有错的话,他可能会错过实际的要求,即只有名称值而不是链接。 所以试试这个

    $dom = new DomDocument();
    $dom->loadHTML($str);
    
    $names = [];
    foreach($dom->getElementsByTagName('a') as $a) {
        $names[] =  $a->nodeValue;
    }
    
    print_r($names);
    
        4
  •  0
  •   The fourth bird    7 年前

    DOMXPath 并准确指定要查找的内容:

    //li/a

    例如:

    $str = '<li><a href="/somelink1">name1</a></li><li><a href="/somelink2">name2</a></li><li><a href="/somelink3">name3</a></li>';
    $dom = new DomDocument();
    $dom->loadHTML($str);
    $xpath = new DOMXPath($dom);
    $result = [];
    foreach($xpath->evaluate('//li/a') as $a) {
        $result[] = $a->nodeValue;
    }
    
    print_r($result);
    

    Array
    (
        [0] => name1
        [1] => name2
        [2] => name3
    )
    
    推荐文章