搜索字符串内的元素

时间:2015-01-14 17:35:24

标签: php string split

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

我需要使用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;),这将返回:

____name____   
interfacename1  
interfacename2  
interfacename3

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

<?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
?>

但我只能检索第一个元素。如何获取此字符串中的所有元素?

2 个答案:

答案 0 :(得分:2)

试试这个解决方案:)

<?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];
}

答案 1 :(得分:0)

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

为了解决这个问题,我调整了$ 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];
}