drweb3
25.07.2018 - 00:42
Нужно разобрать строку в которой параметры в виде имя=значение с возможными кавычками экранированием и всем таким. например
alpha=a beta="бета" с=can\'t
Пока ничего проще не придумал чем:
exec("php -r \'foreach($argv as $a) echo \"$a\n\";\' -- ".$line, $out, $retval);
и далее разбор строк через split("=", ...
Но меня не покидает ощущение, что должен быть способ покрасивее
sergeiss
26.07.2018 - 00:04
А зачем тут exec()? Ежели ты и так внутри ПХП, то просто напиши код на ПХП, который это всё разбирает на части и обрабатывает.
Когда напишешь этот код, то будет о чем говорить более предметно
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
walerus
26.07.2018 - 02:06
Вообще какой то набор символов...
Дана - строка, в "коде" идет перебор массива, что от куда получилось хз.
drweb3
26.07.2018 - 09:15
Ладно, возможно изложено несколько сумбурно. Попытаюсь еще раз. И так. Дана строка.
$line = 'alpha=a beta="бе та" с=can\ \'t';
Откуда она получается, не так важно. К примеру берется из файла или базы во время выполнения скрипта PHP. Из нее хочу получить ассоциативный массив вида
$result = [
'alpha' => 'a',
'beta' => 'бе та',
'c' => "сan 't"
];
То есть надо сделать разбор параметров коммандной строки, но полученной из другого места, а не из коммандной строки скрипта.
Сейчас решено так:
$line = 'alpha=a beta="бе та" с=can\ \'t';
$php = 'php -r \'foreach($argv as $a) echo "$a\n";\' -- '.$line;
exec($php, $out, $retval);
if (!$retval) {
foreach ($out as $line) {
$split = split("=", $line);
if ($split[0] != '-') {
$result[$split[0]] = $split[1];
}
}
}
Цитата (walerus @ 26.07.2018 - 02:06) |
Дана - строка, в "коде" идет перебор массива, что от куда получилось хз. |
Ну вообще, если приглядеться, то идет перебор массива аргументов переданных php внутри этого exec.
Цитата (sergeiss @ 26.07.2018 - 00:04) |
А зачем тут exec()? |
exec() тут для того, чтобы избавиться от кавычек и экранирований и распихать аргументы в $argv, который потом обработать. В этом и состоит вопрос, как избавиться от кавычек и экранирований без такой чудо конструкции.
Решение через preg_split делящее строку на слова, но не обращающее внимания на пробелы в кавычках и на экранированные обратным слешом пробелы, а потому удаляющее не нужные в данном контексте кавычки, апострофы и экранирования - более громозско, но наверняка же должна быть какая-то готовая функция. php же как то это делает внутри себя.