PHP-为什么此正则表达式匹配太多? (不要停在斜线处)

这个问题已经在这里有了答案:            >            My regex is matching too much. How do I make it stop?                                    5个
这段代码输出$captured数组,但是$captured [1]包含bar / this而不是我期望的bar.我的正则表达式中缺少什么来阻止返回超过bar的内容

<?PHP

    $pattern = '/foo/:any/';
    $subject = '/foo/bar/this/that';

    $pattern = str_replace(':any', '(.+)', $pattern);
    $pattern = str_replace(':num', '([0-9]+)', $pattern);
    $pattern = str_replace(':alpha', '([A-Za-z]+)', $pattern);

    echo '<pre>';

    $pattern = '#^' . $pattern . '#';
    preg_match($pattern, $subject, $captured);

    print_r($captured);
    echo '</pre>';

解决方法:

使用non-greedy modifier使匹配的字符尽可能少,而不是尽可能多:

$pattern = str_replace(':any', '(.+?)', $pattern);
                                   ^

您可能还想在正则表达式周围添加delimiters并将其锚定到字符串的开头:

$pattern = '#^/foo/:any/#';

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...