Позвольте мне объяснить, что я хочу делать.
Мне нужно подключиться к устройству с использованием 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]; }