Элементы поиска внутри строки

Позвольте мне объяснить, что я хочу делать.

Мне нужно подключиться к устройству с использованием SSH и выполнить некоторые команды оболочки. Я получаю результат этих команд (поток, используя 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; ), и это вернет:

 ____имя____   
 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-й элемент. Как я могу получить все элементы этой строки?

попробуйте с этим решением 🙂

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

Используя ответ Халайема Аниса, я смог найти все элементы в строке. Но я нашел другую проблему. Если у меня есть такая строка: 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]; }