[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разбор параметров (туплю)
drweb3
Нужно разобрать строку в которой параметры в виде имя=значение с возможными кавычками экранированием и всем таким. например
alpha=a beta="бета" с=can\'t

Пока ничего проще не придумал чем:
exec("php -r \'foreach($argv as $a) echo \"$a\n\";\' -- ".$line, $out, $retval);

и далее разбор строк через split("=", ...

Но меня не покидает ощущение, что должен быть способ покрасивее
sergeiss
А зачем тут exec()? Ежели ты и так внутри ПХП, то просто напиши код на ПХП, который это всё разбирает на части и обрабатывает.
Когда напишешь этот код, то будет о чем говорить более предметно smile.gif

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
walerus
Вообще какой то набор символов... blink.gif
Дана - строка, в "коде" идет перебор массива, что от куда получилось хз.
drweb3
Ладно, возможно изложено несколько сумбурно. Попытаюсь еще раз. И так. Дана строка.
$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 же как то это делает внутри себя.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.