这是我关心的问题, 我有一个字符串,我需要两个两个地提取字符。
$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
根本无法做到这一点?
答案 0 :(得分:4)
对于第一个问题,您要做的是匹配重叠字符串,这需要零宽度(不消耗文本)环视以获取字符:
/(?=(\w{2}))/
上面的正则表达式将捕获第一个捕获组中的匹配。
对于第二个问题,您似乎也想要重叠字符串。使用相同的技巧:
/(?=(\b\w+ \w+\b))/
请注意,添加\b
以检查单词的边界。由于匹配不消耗文本,因此将在下一个索引(位于第一个单词的中间)而不是第二个单词的结尾处尝试下一个匹配。我们不想从一个单词的中间捕获,所以我们需要边界检查。
请注意,\b
的定义基于\w
,因此,如果您更改了单词的定义,则需要使用前瞻和后瞻模拟单词边界相应的字符集。
答案 1 :(得分: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 。