2015-01-14 115 views
1

讓我解釋我想要做什麼。字符串內搜索元素

我需要使用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"; 

我需要獲得所有的名字='的結果,如(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 
?> 

但我只能檢索第一個元素。我怎樣才能得到這個字符串中的所有元素?

+1

也許是更好的空間/逗號爆炸字符串,然後通過'='爆炸爆炸蜇傷,並找到鑰匙,你需要什麼? –

回答

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]; 
} 
+0

這工作完美!是我在尋找什麼。謝謝! – lwb

+0

只是另一個問題:有沒有辦法做類似的搜索,但這樣的使用:SELECT stringx WHERE name = interface1? – lwb

+1

在這種情況下,您需要一個ETL工具:像Talend一樣提取轉換加載,將數據庫中存儲的字符串轉換爲字符串。請參閱此鏈接瞭解更多信息:http://www.talend.com/resource/free-etl.html –

0

使用Halayem阿尼斯的答案我能找到的所有元素字符串。 但我發現其他問題。如果我有這樣的字符串:name =「foo bar」(中間有空格)。

爲了解決這個問題,我調整了$模式。

結果是:

//$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]; 
}