让我们举一个以下字符串的例子:
$string = "length:max(260):min(20)";
在上面的字符串中,:max(260):min(20)
是可选的。我希望得到它,如果它存在,否则只应返回length
。
我有以下正则表达式,但它不起作用:
/(.*?)(?::(.*?))?/se
当我使用preg_match
函数时,它不会返回数组中的任何内容。
请记住,除了上面的字符串,还有其他内容。也许是这样的:
$string = "number:disallow(negative)";
我的正则表达式中是否有任何问题或PHP无法返回任何内容?转储preg_match
会返回int 1
,这意味着字符串与正则表达式匹配。
完全倾倒:
int 1
array (size=2)
0 => string '' (length=0)
1 => string '' (length=0)
答案 0 :(得分:3)
在开始时,你在懒惰的情况下使用单个字符(.
)匹配。所以它停在零位。如果您将preg_match
功能更改为preg_match_all
,则会看到已捕获的群组。
另一个问题是你的正则表达式。你正在杀死引擎。同样e
修饰符在几十年前就被弃用了!!!但它仅在preg_replace
函数中使用。
也不要使用s
修饰符!这不是必需的。
这适用于您的情况:
/([^:]+)(:.*)?/
答案 1 :(得分:1)
我尝试准备一个正则表达式,可以解决你的问题,并为它添加一些价值
这个正则表达式不仅匹配可选元素,还会捕获键值对
<强>正则表达式强>
/(?<=:|)(?'prop'\w+)(?:\((?'val'.+?)\))?/g
测试字符串
length:max(260):min(20)
length
number:disallow(negative)
<强>结果强>
length
max
260
min
20
length
number
disallow
negative
修改强>
我想我理解你用不同的密钥重复数组的意思,这是由于命名的捕获,例如。道具&amp; VAL
这里是没有命名捕获的修订
<强>正则表达式强>
/(?<=:|)(\w+)(?:\((.+?)\))?/
示例代码
$str = "length:max(260):min(20)";
$str .= "\nlength";
$str .= "\nnumber:disallow(negative)";
preg_match_all("/(?<=:|)(\w+)(?:\((.+?)\))?/",
$str,
$matches);
print_r($matches);
<强>结果强>
Array
(
[0] => Array
(
[0] => length
[1] => max(260)
[2] => min(20)
[3] => length
[4] => number
[5] => disallow(negative)
)
[1] => Array
(
[0] => length
[1] => max
[2] => min
[3] => length
[4] => number
[5] => disallow
)
[2] => Array
(
[0] =>
[1] => 260
[2] => 20
[3] =>
[4] =>
[5] => negative
)
)