2012-09-18 22 views
0

我知道在這一點上我只是頭腦簡單,但我很難過。假設我有一個如下所示的文本目標:在PHP中正則表達式在詞語上過於貪婪

約翰尼真的以1234的祖父John Hugenot命名,但他的T5677 id是JH6781,他的小弟弟的HG766 id是RB1223。

使用此RegExp:\s[A-Z][A-Z]\d\d\d\d\s,我將如何單獨提取匹配字符串的第一個和第二個匹配項? 「JH6781」和「RB1223」。我保證匹配的字符串將在目標文本中顯示兩次。

注意:我不想更改現有的字符串,所以str_replace()不是一個選項。

+0

所以,你總是要提取第二和第四個[AZ] [AZ] \ d {4}'? –

回答

1

您可以使用preg_match與偏移參數(5th)和strpos的組合來選擇第一個和第二個匹配項。 另外,您可以使用preg_match_all,只是使用前兩個數組項

<?php 
$first = preg_match($regex, $subject, $match); 
$second = preg_match($regex, $subject, $match, 0, strpos($match[0]) + 1); 
?> 
4

呃......怎麼樣使用這個正則表達式:

/\b[A-Z]{2}\d{4}\b/ 

這意味着「一個字匹配邊界,後緊跟兩個大寫英文字母,後跟正好四位數字,後面跟着一個單詞邊界'。所以它不會匹配'TGX7777'(字邊界後跟三個字母 - 模式匹配失敗),並且它不會匹配'TX77777'(四位數字後跟另一位數字 - 再次失敗)。

這就是它如何使用:

$str = "Johnny was really named for his 1234 grandfather, John Hugenot, but his T5677 id was JH6781 and his little brother's HG766 id was RB1223."; 

preg_match_all('/\b[A-Z]{2}\d{4}\b/', $str, $matches); 
var_dump($matches[0]); 
// array 
// 0 => string 'JH6781' (length=6) 
// 1 => string 'RB1223' (length=6) 
3
$s='Johnny was really named for his 1234 grandfather, John Hugenot, but his T5677 id was JH6781 and his little brother\'s HG766 id was RB1223.'; 
$n=preg_match_all('/\b[A-Z][A-Z]\d\d\d\d\b/',$s,$m); 

給出結果$n=2,然後

print_r($m); 

給出結果

Array 
(
    [0] => Array 
     (
      [0] => JH6781 
      [1] => RB1223 
     ) 
) 
+0

喜歡它,謝謝!花了一點點的答案,並用'preg_match_all()'提出'\ b [A-Z] {2} \ d {4} \ b'。奇蹟般有效。 – DevlshOne