2010-05-17 99 views
0

我一直在看这些代码,它应该符合我的$输入字符串和$ [0]店“测试”为什么preg_match不返回1?

$input = ':testing'; 
$r = preg_match('/^(?<=\:).+/',$input,$matches); 

有什么不对它匹配?

回答

4

(?<=)是正look- 后面,这意味着匹配封闭表达式文本必须之前发生该图案中的括号的位置。在这种情况下,这意味着它必须发生在字符串开始位置(^)之后,但在第一个实际字符(.+匹配字符串中的所有字符)之前,并且由于:是第一个实际字符,并且在:(显然)之前没有:,它无法匹配。

相反,你可能想要做的是使用捕获组,就像这样:

$input = ':testing'; 
$r = preg_match('/^:(.+)/',$input,$matches); 

// $matches[0] has the entire text matched by the pattern, ":testing" 
// $matches[1] will now contain "testing" from the first capture 

因此您使用$matches[1]从捕获组,这是你想要什么范围内获取文本。

+0

+1您还可以删除原始正则表达式中的“^”。 – 2010-05-17 22:28:29

+0

在原始正则表达式中删除'^'可能会改变Felix的含义和匹配的内容,因为它现在会部分匹配诸如''abc:testing''之类的东西,而原始正则表达式非常清楚地看着整个字符串只要。 – Amber 2010-05-17 22:37:20

+0

谢谢你非常翔实。 – JavaRocky 2010-05-17 22:57:38