如何使用正则表达式或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_id
从preg_match
获取值?
答案 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号,可以使用:
(.+?)
和我们想要的值可以简单地使用(?: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);