在字符串中搜索元素

Search elements inside string

让我解释一下我想做什么。

我需要使用 SSH 连接到设备并执行一些 shell 命令。我得到这些命令的结果(流,使用 ssh2_fetch_stream)并保存到一个变量中。这很好用。

但我需要知道的是如何按字符串中的元素进行搜索? 这里有一个示例字符串:

$stringToSearch = "id=10 name=interfacename1 stringx=102040 stringy=50606040,id=20 name=interfacename2 stringx=872345 stringy=23875454,id=30 name=interfacename3 stringx=654389 stringy=34567865";

我需要获得所有 'name=' 结果,例如 (SELECT name FROM stringToSearch;),这会 return:

____name____
接口名称 1
接口名称 2
接口名称 3

我创建了一个简单的函数来读取这个字符串。

<?php
   function readString($stringToSearch, $start, $end) {
   $result = '-1';
   // I need to do a loop here, but how can I do it to read and return all elements between $start and $end? 
   if(strlen(strstr($stringToSearch, $start)) > 0)
   {
        $startsAt = strpos($stringToSearch, $start) + strlen($start);
        $endsAt = strpos($stringToSearch, $end, $startsAt);
        $result = substr($stringToSearch, $startsAt, $endsAt - $startsAt);
   }
   return $result;
}     
$stringToSearch = 'id=10 name=interfacename1 stringx=102040 stringy=50606040,id=20 name=interfacename2 stringx=872345 stringy=23875454,id=30 name=interfacename3 stringx=654389 stringy=34567865';
$element = readString($stringToSearch, 'name=', ' '); // Will return only the 1st element
?>

但我只能检索第一个元素。我怎样才能得到这个字符串中的所有元素?

试试这个解决方案 :)

<?php
$stringToSearch = "id=10 name=interfacename1 stringx=102040 stringy=50606040,id=20 name=interfacename2 stringx=872345 stringy=23875454,id=30 name=interfacename3 stringx=654389 stringy=34567865";

var_dump(getName($stringToSearch));
function getName($stringToSearch) {
    $pattern = '/name=([A-Z0-9]*)/i';
    if(preg_match_all($pattern, $stringToSearch, $result) == 0){
        return NULL;
    }
    return $result[1];
}

增强(获取所需参数的所有值):

/**
  * @param String $varName : the name of variable to get their values. ex: stringx, stringy
  * @param String $stringToSearch : the string to search in
  * @return Array if variable was found in $stringToSearch, NULL else
  */
function getName($varName, $stringToSearch) {
    $pattern = '/' . $varName . '=([A-Z0-9]*)/i';
    if(preg_match_all($pattern, $stringToSearch, $result) == 0){
        return NULL;
    }
    return $result[1];
}

使用 Halayem Anis 的回答,我能够找到字符串中的所有元素。 但是我发现了其他问题。如果我有这样的字符串:name="foo bar"(中间有 space)。

为了解决这个问题,我修改了 $pattern。

结果是:

//$varname = string to be searched like name=
//$stringToSearch = the original string
function getName($varName, $stringToSearch) {
    $pattern = '/(?<=' . $varName . ')"(.*?)"/i';  // Changed this to get all between name="" 
    if(preg_match_all($pattern, $stringToSearch, $result) == 0){
        return NULL;
    }
    return $result[1];
}