2016-11-03 2 views
17

Я пытаюсь разбить строку в PHP, который выглядит следующим образом:матча все подстроки, которые заканчиваются 4 цифры с использованием регулярных выражений

ABCDE1234ABCD1234ABCDEF1234 

в массив строку, которая, в данном случае, как будет выглядеть это:

ABCDE1234 
ABCD1234 
ABCDEF1234 

Таким образом, картина «неопределенное количество букв, а затем 4 цифры, то неопределенное количество букв и 4 цифр и т.д.»

Я пытаюсь разделить строку, используя preg_split так:

$pattern = "#[0-9]{4}$#"; 
preg_split($pattern, $stringToSplit); 

И он возвращает массив, содержащий полную строку (не расщепляется) в первом элементе.

Я предполагаю, что проблема здесь в моем регулярном выражении, поскольку я не совсем понимаю, как их использовать, и я не уверен, правильно ли я использую его.

Так что будет правильным регулярным выражением?

+1

Вы уверены, что не можете просто разбить строку после номера, за которым следует письмо? Из вашего примера кажется, что вы можете это сделать полностью. – user1306322

+0

Почему вы не можете просто найти все места, где у вас есть пара цифр, которая даст вам позиции, чтобы сломать строку. –

+0

Мог бы это сделать, я не «понял» ... хорошо, что это работает! – DevBob

ответ

16

Вы не хотите preg_split, вы хотите preg_match_all:

$str = 'ABCDE1234ABCD1234ABCDEF1234'; 
preg_match_all('/[a-z]+[0-9]{4}/i', $str, $matches); 
var_dump($matches); 

Выход:

array(1) { 
    [0]=> 
    array(3) { 
    [0]=> 
    string(9) "ABCDE1234" 
    [1]=> 
    string(8) "ABCD1234" 
    [2]=> 
    string(10) "ABCDEF1234" 
    } 
} 
7

PHP использует PCRE-стилевые выражения, которые позволяют вам делать lookbehinds. Вы можете использовать это, чтобы увидеть, есть ли 4 цифры за вами. Объединение, что с опережающего просмотра, чтобы увидеть, если есть письмо перед вами, и вы получите это:

(?<=\d{4})(?=[a-z]) 

Примечание пунктирные линии на Debuggex Demo странице. Это те точки, которые вы хотите разделить.

В PHP это будет:

var_dump(preg_split('/(?<=\d{4})(?=[a-z])/i', 'ABCDE1234ABCD1234ABCDEF1234')); 
+0

В регулярном выражении «PHP» вам явно не нужно явно указывать 4 цифры, вы можете просто проверить цифру, за которой следует буква? то есть. '/ (? <= \ d) (? = [a-z])/i' _ (+ 1) _ – MrWhite

+0

@ w3dk в этом случае да, мне просто нравится мое регулярное выражение, когда это возможно :) – funkwurm

5

Используйте принцип контраста:

\D+\d{4} 
# requires at least one non digit 
# followed by exactly four digits 

См a demo on regex101.com.


В PHP это было бы:

<?php 
$string = 'ABCDE1234ABCD1234ABCDEF1234'; 
$regex = '~\D+\d{4}~'; 
preg_match_all($regex, $string, $matches); 
?> 

См a demo on ideone.com.

1

Я не гожусь в регулярном выражении, так здесь дорога меньше путешествовали:

<?php 
$s = 'ABCDE1234ABCD1234ABCDEF1234'; 
$nums = range(0,9); 

$num_hit = 0; 
$i = 0; 
$arr = array(); 

foreach(str_split($s) as $v) 
{ 
    if(isset($nums[$v])) 
    { 
     ++$num_hit; 
    } 

    if(!isset($arr[$i])) 
    { 
     $arr[$i] = ''; 
    } 

    $arr[$i].= $v; 

    if($num_hit === 4) 
    { 
     ++$i; 
     $num_hit = 0; 
    } 
} 

print_r($arr);