我有一个文字:
$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'
)
)
我不想要逗号或输出中的空格:( ..问题是逗号是可选的;
答案 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]+
,一个或多个数字的序列)或可以包含转义序列("(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*'
)的带引号的字符串,后跟可选的空格或制表符。