用于忽略可选逗号的正则表达式

时间:2010-08-16 20:28:00

标签: php regex preg-match-all

我有一个文字:

$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 个答案:

答案 0 :(得分:2)

/@(.*?)\s*=\s*(.*?),?/

在适当的位置添加\s*以匹配空格。使用.*?的问号来匹配非贪婪。非贪婪匹配匹配尽可能短的匹配,因此(.*?),?将使右边的逗号匹配逗号而不是捕获逗号的.*

答案 1 :(得分:2)

在你的正则表达式$regEx = '/@(.*)=(.*)[,]*?/';中,第二个(。*)是贪婪的,并且会与逗号匹配,因为你写的逗号是可选的。

未经测试,此正则表达式将允许等号周围的可选空格,但不包括它们在捕获'/@([^\s=]+)\s*=\s*([^\s,]+)\s*,?/'中它还允许值和逗号之间的空格。

答案 2 :(得分:0)

您应该比仅使用.更具体,例如:

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

此处[a-zA-Z]+将名称指定为字母字符序列。然后是=,后面可能有空格或制表符。然后该值可以是数字([0-9]+,一个或多个数字的序列)或可以包含转义序列("(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*')的带引号的字符串,后跟可选的空格或制表符。