2013-03-14 5 views
1

Вот моя забота, У меня есть строка, и мне нужно извлечь символы два за другим.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}))/ 

regex выше будет фиксировать совпадение в первой группе захвата.

DEMO

Для второй задачи, то кажется, что вы хотите перекрывающийся строку. Используя тот же трюк:

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

Обратите внимание, что \b добавляется, чтобы проверить границы слова. Поскольку совпадение не потребляет текст, следующий матч будет предпринят при следующем индексе (который находится в середине первого слова), а не в конце второго слова. Мы не хотим захватывать с середины слова, поэтому нам нужна пограничная проверка.

Отметьте, что определение \b основано на \w, поэтому, если вы когда-либо изменяете определение слова, вам нужно подражать границе слова с помощью внешнего вида и внешнего вида с соответствующим набором символов.

DEMO

+0

спасибо, что он отлично работает. Любое предложение по второй проблеме? – LostSEO

+0

Вторая проблема решена также, спасибо снова – LostSEO

1

В случае, если вам нужно решение Non-Regex, попробуйте это ...

<?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.

Смежные вопросы