2013-07-30 33 views
0

我試着去尋找一個字符串三個數據,他們是:正則表達式,PHP,「AND」

first name, space ,last name (?=[A-Z][a-z]+\s[A-Z][a-z]+) 
//AND 
first name ,space ,last name ,and suffix (?=[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+) 
//AND, 
age (?=[0-9]{2}) 

從幾個教程我已經看到了它看來,這三種模式:

(?=[A-Z][a-z]+\s[A-Z][a-z]+)(?=[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+)(?=[0-9]{2}) 

在一起,應該是我的解決方案,但它不工作....任何建議....(它的一個PHP腳本和IM使用preg_match_all)

我的腳本:

$content = file_get_contents('http://www.somesite.com'); 
$pattern = '/(?=[A-Z][a-z]+\s[A-Z][a-z]+)(?=[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+)(?=[0-9]{2}) /'; 
if(preg_match_all($pattern,$content,$matches)) 
{ 
// has the pattern, do something 
//$matches has all the matches from preg_match 

    } 
+0

請發佈您的腳本 –

+0

字符串「its [sic] not working」不是PHP中的內置錯誤消息。 – 2013-07-30 04:13:10

+0

我發佈了我的腳本...我在錯誤控制檯中沒有收到錯誤... – codenamejupiterx

回答

0

你正在尋找一個或運營商,而不是AND:詞之間

[A-Z][a-z]+\s[A-Z][a-z]+|[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+|[0-9]{2} 

如果可以有多個空格字符,一定要量化\s

[A-Z][a-z]+\s+[A-Z][a-z]+|[A-Z][a-z]+\s+[A-Z][a-z]+\s+[A-Z][a-z]+|[0-9]{2} 

如果您正在尋找完全匹配,請不要忘記錨點^$)。

0

可以使用非捕獲組(?:...)和問號,使組可選:

[A-Z][a-z]+\s[A-Z][a-z]+(?:\s[A-Z][a-z]+(?:\s[0-9]{2,3})?)? 

如果你想提取數據,使用名爲捕捉是一種清潔方式:

$pattern = <<<'LOD' 
~ 
(?<first_name>[A-Z][a-z]+) 
\s+ 
(?<last_name>[A-Z][a-z]+) 
(?: 
    \s+ (?<suffix>[A-Z][a-z]+) 
    (?: \s+ (?<age> [0-9]{2,3}))? 
)? 
~x 
LOD; 

preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER); 

foreach ($matches as $match) { 
    echo '<br/>' . $match['first_name'] . ', ' . $match['last_name']; 
} 
1

這種多重前瞻技巧適用於您知道某些組件必須存在的時間,但您不知道它們將以何種順序出現。您通常在執行強密碼策略的正則表達式中看到它。

你的問題要簡單得多;組件總是以相同的順序出現,但最後一個是可選的。這是很容易:

'/\b([A-Z][a-z]*)\s+([A-Z][a-z]*)(?:\s+([0-9]{2}))?\b/' 

第一個名字是在組#1抓獲,姓將在組#2,如果有一個後綴,你會在組#3中找到它。