PHP从字符串

时间:2018-09-29 14:58:54

标签: php arrays

我正在尝试从字符串中提取每个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 个答案:

答案 0 :(得分:4)

您可以为此使用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 )

答案 1 :(得分:1)

有多种方法可以使用,而 regex 是其中一种。您可以使用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

REGEX https://regex101.com/r/HPDhtA/1

答案 2 :(得分:0)

@ splash58答案实际上是正确的,但他可能会错过实际要求,即如果我没记错的话,只有“名称”值不链接。 因此,只需尝试

$dom = new DomDocument();
$dom->loadHTML($str);

$names = [];
foreach($dom->getElementsByTagName('a') as $a) {
    $names[] =  $a->nodeValue;
}

print_r($names);

答案 3 :(得分:0)

您还可以使用DOMXPath使用xpath表达式并确切指定要查找的内容:

//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
)