PHP Regex:如果存在,如何获取可选文本?

时间:2014-08-08 12:13:00

标签: php regex

让我们举一个以下字符串的例子:

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

2 个答案:

答案 0 :(得分:3)

在开始时,你在懒惰的情况下使用单个字符(.)匹配。所以它停在零位。如果您将preg_match功能更改为preg_match_all,则会看到已捕获的群组。

另一个问题是你的正则表达式。你正在杀死引擎。同样e修饰符在几十年前就被弃用了!!!但它仅在preg_replace函数中使用。

也不要使用s修饰符!这不是必需的。

这适用于您的情况:

/([^:]+)(:.*)?/

Online demo

答案 1 :(得分:1)

我尝试准备一个正则表达式,可以解决你的问题,并为它添加一些价值

这个正则表达式不仅匹配可选元素,还会捕获键值对

<强>正则表达式

/(?<=:|)(?'prop'\w+)(?:\((?'val'.+?)\))?/g

测试字符串

length:max(260):min(20)
length
number:disallow(negative)

<强>结果

  • 比赛1
    • prop [0-6] length


  • 比赛2
    • 道具[7-10] max
    • val [11-14] 260


  • 比赛3
    • prop [16-19] min
    • val [20-22] 20


  • 比赛4
    • prop [24-30] length


  • 比赛5
    • prop [31-37] number


  • 比赛6
    • prop [38-46] disallow
    • val [47-55] negative

尝试demo here


修改

我想我理解你用不同的密钥重复数组的意思,这是由于命名的捕获,例如。道具&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
        )
)

尝试demo here