1

这是我的担心,我有一个字符串,我需要两个两个提取字符。

$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

2 回答 2

4

对于第一个问题,您要做的是匹配重叠字符串,这需要零宽度(不消耗文本)环顾四周来抓取字符:

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

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

演示

对于第二个问题,您似乎也想要重叠字符串。使用相同的技巧:

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

请注意,\b添加以检查单词的边界。由于匹配不消耗文本,因此将在下一个索引(位于第一个单词的中间)尝试下一个匹配,而不是在第二个单词的末尾。我们不想从单词中间捕获,所以我们需要边界检查。

请注意,\b的定义是基于 的\w,因此,如果您更改了单词的定义,则需要使用前瞻和后视来模拟单词边界,并使用相应的字符集。

演示

于 2013-03-14T05:26:04.460 回答
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);

?>

请参阅键盘

于 2013-03-14T05:28:35.453 回答