如何从字符串中提取ID号?

时间:2019-05-26 18:49:57

标签: php regex substr delimited-text

如何使用正则表达式或preg_match检索中间值?

$str = 'fxs_124024574287414=base_domain=.example.com; datr=KWHazxXEIkldzBaVq_of--syv5; csrftoken=szcwad; ds_user_id=219132; mid=XN4bpAAEAAHOyBRR4V17xfbaosyN; sessionid=14811313756%12fasda%3A27; rur=VLL;'

如何仅使用正则表达式或ds_user_idpreg_match获取值?

3 个答案:

答案 0 :(得分:3)

使用preg_match来匹配ds_user_id=,然后忘记那些与\K匹配的字符,然后匹配一个或多个数字。没有捕获组,没有环顾四周,没有解析所有键值对,没有爆炸。

代码:(Demo

$str = 'fxs_124024574287414=base_domain=.example.com; datr=KWHazxXEIkldzBaVq_of--syv5; csrftoken=szcwad; ds_user_id=219132; mid=XN4bpAAEAAHOyBRR4V17xfbaosyN; sessionid=14811313756%12fasda%3A27; rur=VLL;';
echo preg_match('~ds_user_id=\K\d+~', $str, $out) ? $out[0] : 'no match';

输出:

219132

答案 1 :(得分:1)

好的,没有什么能击败mickmackusa impl ParseError for std::str::ParseBoolError {} impl ParseError for std::num::ParseFloatError {} impl ParseError for std::num::ParseIntError {} impl ParseError for std::net::AddrParseError {} impl ParseError for std::char::ParseCharError {} 结构。
但是,对于 \ K 受损的发动机,这是次要的事情

\K

解释

(\d(?<=ds_user_id=\d)\d*)(?=;)

这是一个动词解决方案(无\ K),速度提高了%30。

 (                          # (1 start), Consume many ID digits
      \d                         # First digit of ID
      (?<= ds_user_id= \d )      # Look behind, assert ID key exists before digit
      \d*                        # Optional the rest of the digits
 )                          # (1 end)
 (?= ; )                    # Look ahead, assert a colon exists

一些比较基准

 (                             # (1 start), Consume many ID digits
      \d                            # First digit of ID
      (?:
           (?<! ds_user_id= \d )         # Look behind, if not ID,
           \d*                           # get rest of digits
           (*SKIP)                       # Fail, then start after this
           (?!)
        |  
           \d*                           # Rest of ID digits
      )
 )                             # (1 end)
 (?= ; )                       # Look ahead, assert a colon exists

答案 2 :(得分:0)

如果我们想使用{ "presets": ["es2015", "stage-0"], "plugins": ["transform-runtime"] }

explode

输出

$str = 'fxs_124024574287414=base_domain=.example.com; datr=KWHazxXEIkldzBaVq_of--syv5; csrftoken=szcwad; ds_user_id=219132; mid=XN4bpAAEAAHOyBRR4V17xfbaosyN; sessionid=14811313756%12fasda%3A27; rur=VLL;';

$arr = explode(';', $str);

foreach ($arr as $key => $value) {
    if (preg_match('/ds_user_id/s', $value)) {
        $ds_user_id = explode('=', $value);
        echo $ds_user_id[1];
    }
}

在这里,我们还可以将两个非捕获组与一个捕获组一起使用:

219132

我们有一个左边界:

(?:ds_user_id=)(.+?)(?:;)

和右边界:

(?:ds_user_id=)

,我们将收集所需的数字或希望使用的其他任何东西:

(?:;)

如果我们希望验证我们的ID号,可以使用:

(.+?)

DEMO

和我们想要的值可以简单地使用(?:ds_user_id=)([0-9]+?)(?:;) 来调用。

测试

var_dump($matches[0][1]);

输出

$re = '/(?:ds_user_id=)(.+?)(?:;)/m';
$str = 'fxs_124024574287414=base_domain=.example.com; datr=KWHazxXEIkldzBaVq_of--syv5; csrftoken=szcwad; ds_user_id=219132; mid=XN4bpAAEAAHOyBRR4V17xfbaosyN; sessionid=14811313756%12fasda%3A27; rur=VLL;';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);

DEMO