2

我有一段文字:

$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'
        )

)

我不想在输出中使用逗号或空格:( .. 问题是逗号是可选的;

4

3 回答 3

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

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

于 2010-08-16T20:35:11.353 回答
2

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

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

于 2010-08-16T20:38:34.340 回答
0

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

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

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

于 2010-08-16T20:38:17.207 回答