Регулярное выражение печатает один из двух в соответствии шаблону - PullRequest
0 голосов
/ 09 июля 2010

Привет, ребята, вопрос о регулярных выражениях в PHP!

Для данного шаблона, что-то вроде синтаксиса терминала оболочки:

application>function -arg1 value -arg2 value -arg3 value -arg4 value

Я хочу разобрать аргументы.Это мой код регулярного выражения

$command=' -arg1 value -arg2 value -arg3 value -arg4 value ';

// note the string begins by a space character and ends by a space character
// now i'm trying to parse arguments

$cmd->arguments=new \stdClass();

preg_replace('`\s-(.*)\s([a-zA-Z0-9-_]*)\s`Ue',
'$cmd->arguments->$1="$2";',$command);

// this regex will pick one matching out of two and returns

$cmd->arguments=stdClass(

    [arg1]=>value,
    [arg3]=>value

)

arg2 и arg4 пропущены.Есть идеи почему?Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 09 июля 2010

Чтобы ответить на ваш вопрос: у вас есть пробел \s как в начале, так и в конце вашего регулярного выражения, поэтому после первого совпадения arg1 первое вхождение \s- будет в arg3, потому чтопространство, которое вы ищете до того, как arg2 уже будет найдено в конце первого совпадения.

Также может быть проще просто trim() строка и затем split() / explode() впробелы.

Редактировать: Кстати, удаление \s в конце должно решить вашу проблему.

0 голосов
/ 09 июля 2010

Как сказал jeroen, ваша конкретная проблема - \s в начале и в конце вашего регулярного выражения.

Легко переписать это регулярное выражение, так что пробелы вообще не нужны, кроме как между arg и value. Рассмотрим это регулярное выражение:

-(.*?)\s+([a-zA-Z0-9-_]*)

Матчи:

    -arg1 value -arg2 value -arg3 value  -arg4  value  //spaces before and between...
-arg1 value    -arg2 value -arg3 value   -arg4    value //no lead spaces...      
0 голосов
/ 09 июля 2010

Используйте getopt () http://www.tuxradar.com/practicalphp/21/2/4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...