2013-07-30 35 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中找到它。