在正则表达式中允许一个或零匹配,但更喜欢一个

时间:2014-09-29 15:00:10

标签: regex .htaccess regex-greedy

我想匹配url字符串中的查询参数,例如?foo=bar&para=val。 我需要一个正则表达式模式,查看是否有foo参数并返回它的值。如果没有匹配则返回空字符串 我尝试了这种模式:/(?:foo=([^&]+))?/但它返回一个空匹配。如果我将其更改为/(foo=([^&]+))+/

,则返回该值

预期结果:

  • ?foo=myvalue&bar=bazz应该返回myvalue
  • ?bar=bazz应该返回(empty string)

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

(?<!\w)foo=([^&]*)|

这样做应该足够了。抓住捕获。参见演示。

http://regex101.com/r/nA6hN9/18

答案 1 :(得分:1)

虽然可以与正则表达式匹配,但为什么不使用parse_urlparse_str

<?php

$url = 'http://domain.com?foo=bar&bar=foo&rab=oof&oof=rab';

parse_str(parse_url($url, PHP_URL_QUERY), $params);

if (!empty($params)) {
    print_r($params);
    /*
        Array
        (
            [foo] => bar
            [bar] => foo
            [rab] => oof
            [oof] => rab
        )
    */

    if (isset($params['foo'])) {
        var_dump($params['foo']); // string(3) "bar"
    }
}

DEMO

答案 2 :(得分:0)

如果支持您的工具/语言,您可以尝试:

(?<=[?&]foo=)[^&]*