Регулярное выражение для игнорирования необязательной запятой - PullRequest
2 голосов
/ 17 августа 2010

У меня есть текст:

$test = <<<START
 DOTHIS themsp1
  @theint =    431,
  @theText = "%dumdum%",
  @operator = 'ANY',
  @crossCheck = 'PLUS'


START;

Фильтр:

$regEx = '/@(.*)=(.*)[,]*?/';
preg_match_all($regEx,$test,$vars,PREG_SET_ORDER);
print_r($vars);

Выход:

Array
(
    [0] => Array
        (
            [0] => @theint =  431,
            [1] => theint 
            [2] =>   431,
        )

    [1] => Array
        (
            [0] => @theText = "%dumdum%",
            [1] => theText 
            [2] =>  "%dumdum%",
        )

    [2] => Array
        (
            [0] => @operator = 'ANY',
            [1] => operator 
            [2] =>  'ANY',
        )

    [3] => Array
        (
            [0] => @crossCheck = 'PLUS'
            [1] => crossCheck 
            [2] =>  'PLUS'
        )

)

Мне не нужны запятые ИЛИ пробелы в выводе :( .. Проблема в том, что запятые являются необязательными;

Ответы [ 3 ]

2 голосов
/ 17 августа 2010

В вашем регулярном выражении $regEx = '/@(.*)=(.*)[,]*?/'; 2-й (. *) Является жадным и будет соответствовать запятой, поскольку запятая, как вы написали, является необязательной.

Не проверено, это регулярное выражение разрешит дополнительные пробелы вокруг одинаковогоподписывать, но не включать их в перехват '/@([^\s=]+)\s*=\s*([^\s,]+)\s*,?/' Он также допускает пробел между значением и запятой.

2 голосов
/ 17 августа 2010
/@(.*?)\s*=\s*(.*?),?/

Добавьте \s* в соответствующих местах для соответствия пробелу.Используйте знак вопроса для .*?, чтобы соответствовать не жадно.Нежадное совпадение соответствует как можно более короткому совпадению, поэтому (.*?),? позволит запятой справа совпадать с запятой, а не .* запятой.

0 голосов
/ 17 августа 2010

Вы должны быть более точным, чем просто использовать ., например:

/@([a-zA-Z]+)[ \t]*=[ \t]*([0-9]+|"(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*')[ \t]*,?/

Здесь [a-zA-Z]+ указывает имя в виде последовательности буквенных символов.Затем следует =, который может быть окружен пробелами или символами табуляции.И тогда значением является либо число ([0-9]+, последовательность из одной или нескольких цифр), либо строка в кавычках, которая может содержать escape-последовательности ("(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*'), за которыми следуют дополнительные пробелы или табуляции.

...