2016-04-20 3 views
3

я перечисляю некоторые даты в моем PHP приложение, которое приводит в нечто вроде следующего:регулярные выражения (в частности preg_split() PHP)

April2016May2016June2016 т.д.

Я пытаюсь использовать preg_split для форматировать их, как это:

array('April 2016', 'May 2016', 'June 2016')

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

Примечание: я также удаляю все пробелы - в идеале это было бы лучше, если бы оно удаляло только пустое пространство, если бы было больше чем 2 пробела, т. е. hello world не будет изменен, но hello world будет.

preg_split('/\d\d\d\d/g', preg_replace('!\s+!', '', $sidebar_contents));

Использование выше, я получаю сообщение об ошибке указывает, что г идентификатор не является действительным при условии, потому что это не preg_match_all - удалением г результата в следующем:

enter image description here

Спасибо за любая помощь!

+0

вы пробовали [ ' '~ (\ р {L} +) (\ d +) ~' ] (https://regex101.com/r/lG4iV1/1) с 'preg_match_all'? –

ответ

2

Вот способ добиться того, что вы хотите с 1 вызовом preg_match_all и используя array_map после:

preg_match_all('~(\p{L}+)(\d+)~', "April2016May2016June2016", $m); 
$result = array_map(function($k, $v) { return $k . " " . $v; }, $m[1], $m[2]); 
print_r($result); 

См. regex demo и номер IDEONE demo.

картина означает:

  • (\p{L}+) - матч и захватить в группе 1 (будет доступна после согласования с помощью $m[1]) еще один или буквы
  • (\d+) - спичкой и захватить в группе 2 (будет доступен после сопоставления через $m[2]) одну или несколько цифр.

С array_map мы просто присоединяем значения из групп 1 и 2 с пространством.

Альтернатива: (! Только один проход) заполнить полученный массив внутри preg_replace_callback:

$result = array(); 
preg_replace_callback('~(\p{L}+)(\d+)~', function($m) use (&$result) { 
    array_push($result, $m[1] . " " . $m[2]); 
}, "April2016May2016June2016"); 
print_r($result); 

IDEONE demo См.

1

Попробуйте это:

$str = "April2016May2016June2016"; 
preg_match_all("/[a-z]+\\s\\d+/i", preg_replace("/([a-z]+)(\\d+)/i", "$1 $2", $str), $matches); 
print_r($matches[0]); 

Выход:

Array 
(
    [0] => April 2016 
    [1] => May 2016 
    [2] => June 2016 
) 
+0

Удивительный! Спасибо! – connorb

+0

Зачем использовать 2 регулярных выражения, если вы можете сделать всего лишь 1? –

2

Вы можете вставить пробел и раскол:

<?php 
$input = "April2016May2016June2016"; 
var_dump(preg_split('/(?<=\d)(?!\d|$)/i', 
    preg_replace('/(?<!\d)(?=\d)/', ' ', $input))); 
?> 

Выходы:

array(3) { 
    [0]=> 
    string(10) "April 2016" 
    [1]=> 
    string(8) "May 2016" 
    [2]=> 
    string(9) "June 2016" 
} 

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

  • Нет связанных вопросов^_^