我有两种类型的字符串 第一个
"/css/style.min.css HTTP/1.1" 200 7832 index.php?firstId=5&secondid=4,6,8 HTTP/1.1"
第二种
"/css/style.min.css HTTP/1.1" 200 7832 /index.php?firstId=123&secondid=4,6,8" "Mozilla/5.0
我想提取 4,6,8
一个代码适用于所有案例
我试过
$line = '/index.php?firstId=123&secondid=4,6,8" "Mozilla/5.0';
$nbpers = findme($line, 'secondid=', '"') ;
function findme($string, $start, $end){
$string = ' ' . $string;
$ini = strpos($string, $start);
if ($ini == 0) return '';
$ini += strlen($start);
$len = strpos($string, $end, $ini) - $ini;
return substr($string, $ini, $len);
}
但它适用于第一种情况
我还尝试使用此正则表达式/.*?(\d+)$/
来查找以数字结尾的字符串,并在此网站中对其进行了测试,但HTTP/1.1
以数字结尾,因此不是一个好主意
答案 0 :(得分:6)
您可以在secondid=
之后用
(?:\G(?!\A),|secondid=)\K\d+
请参阅regex demo。
<强>详情:
(?:\G(?!\A),|secondid=)
- 匹配上一次成功匹配的结束和,
(请参阅\G(?!\A),
)或(|
)secondid=
子字符串\K
- 省略到目前为止匹配的全文\d+
- 一位或多位请参阅PHP demo:
$s = '"/css/style.min.css HTTP/1.1" 200 7832 /index.php?firstId=123&secondid=4,6,8" "Mozilla/5.0';
preg_match_all('~(?:\G(?!\A),|secondid=)\K\d+~', $s, $results);
print_r($results[0]);
答案 1 :(得分:2)
对我来说,这就像你想提取完整的子串4,6,8
一样。
如果是这样,为什么不简单地使用capturing group在this regex101 demo之后secondid=
之后提取部分。
preg_match('/\bsecondid=([\d,]+)/', $string, $out)
\b
匹配word boundary (
捕获群组 )
以提取部分\d
是数字[0-9]
查看您的updated code sample at eval.in。如果需要,您仍然可以return the exploded part。