如何查找由','分隔的字符串用PHP

时间:2016-12-20 15:00:27

标签: php regex string

我有两种类型的字符串 第一个

"/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以数字结尾,因此不是一个好主意

2 个答案:

答案 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 groupthis regex101 demo之后secondid=之后提取部分。

preg_match('/\bsecondid=([\d,]+)/', $string, $out)

查看您的updated code sample at eval.in。如果需要,您仍然可以return the exploded part