2013-03-14 89 views
1

以下是我的问题, 我有一个字符串,我需要两个两个提取chraracters。Regex Preg_match_all匹配所有模式

$str = "abcdef"应该返回array('ab', 'bc', 'cd', 'de', 'ef')。我想用preg_match_all而不是loops。这是我正在使用的模式。

$str = "abcdef"; 
preg_match_all('/[\w]{2}/', $str); 

事情是,它返回Array('ab', 'cd', 'ef')。它错过了'bc''de'

我有同样的问题,如果我想提取一定数量的话

$str = "ab cd ef gh ij"; 
preg_match_all('/([\w]+){2}/', $str); // returns array('ab cd', 'ef gh'), I'm also missing the  last part 

我缺少什么呢?或者这是不是可以这样做与preg_match_all

回答

4

对于第一个问题,你想要做的是比赛重叠串,这就需要零宽度(不消耗文本)环视抢字符:

/(?=(\w{2}))/ 

的上面的正则表达式将捕获第一个捕获组中的匹配。

DEMO

对于第二个问题,看来你也想重叠的字符串。使用同样的伎俩:

/(?=(\b\w+ \w+\b))/ 

注意\b添加到检字的边界。由于匹配不会消耗文本,下一个匹配将尝试在下一个索引(位于第一个词的中间),而不是在第二个词的末尾。我们不想从一个词的中间抓取,所以我们需要进行边界检查。

请注意,\b的定义基于\w,所以如果您更改过某个单词的定义,则需要使用相应的字符集来预先模拟字边界,并使用相应的字符集进行后缩。

DEMO

+0

非常感谢它,它完美的作品。对第二个问题的任何建议? – LostSEO 2013-03-14 05:33:53

+0

第二个问题也解决了,再次感谢 – LostSEO 2013-03-14 05:36:41

1

在情况下,如果你需要一个非正则表达式解决方案,试试这个...

<?php 

$str = "abcdef"; 
$len = strlen($str); 

$arr = array(); 
for($count = 0; $count < ($len - 1); $count++) 
{ 
    $arr[] = $str[$count].$str[$count+1]; 
} 

print_r($arr); 

?> 

Codepad