2016-12-20 18 views
5

我有2種類型的字符串 第一如何找到一個字符串分隔「」在PHP

"/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與數字結束,因此,這不是一個好想法

回答

6

您可以提取所有secondid=後的逗號分隔的數字與

(?:\G(?!\A),|secondid=)\K\d+ 

regex demo

詳細

  • (?:\G(?!\A),|secondid=) - 匹配以前成功匹配的任何一個結束和一個,(見\G(?!\A),)或(|)一secondid=
  • \K - 忽略匹配,使得整個文本遠
  • \d+ - 1位或更多位

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

可愛的東西,懷疑你可以做得更好。 – JustBaron

2

對我來說這倒像是要提取完整的子4,6,8。 如果是這樣,爲什麼不簡單地使用capturing group來提取secondid=之後的部分,如this regex101 demo

preg_match('/\bsecondid=([\d,]+)/', $string, $out) 
  • \b匹配的word boundary
  • (捕獲組)的部分提取
  • \d是數字[0-9]

請參閱updated code sample at eval.in一個short。如果需要,您仍然可以return the exploded part

+2

1小時前你在哪裏:P –

+0

謝謝,它也可以。 – parik

相關問題