Regex Preg_match_all match all pattern

笑着哭i 提交于 2019-12-13 20:07:41

问题


Here is my concern, I have a string and I need to extract chraracters two by two.

$str = "abcdef" should return array('ab', 'bc', 'cd', 'de', 'ef'). I want to use preg_match_all instead of loops. Here is the pattern I am using.

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

The thing is, it returns Array('ab', 'cd', 'ef'). It misses 'bc' and 'de'.

I have the same problem if I want to extract a certain number of words

$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

What am I missing? Or is it simply not possible to do so with preg_match_all?


回答1:


For the first problem, what you want to do is match overlapping string, and this requires zero-width (not consuming text) look-around to grab the character:

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

The regex above will capture the match in the first capturing group.

DEMO

For the second problem, it seems that you also want overlapping string. Using the same trick:

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

Note that \b is added to check the boundary of the word. Since the match does not consume text, the next match will be attempted at the next index (which is in the middle of the first word), instead of at the end of the 2nd word. We don't want to capture from middle of a word, so we need the boundary check.

Note that \b's definition is based on \w, so if you ever change the definition of a word, you need to emulate the word boundary with look-ahead and look-behind with the corresponding character set.

DEMO




回答2:


In case if you need a Non-Regex solution, Try this...

<?php

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

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

print_r($arr);

?>

See Codepad.



来源:https://stackoverflow.com/questions/15401764/regex-preg-match-all-match-all-pattern

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!