regex — preg_split в php для разбиения строки в точке, которой предшествует цифра, за которой следуют буквы или пробел

Чтобы разбить мою строку в точке, которой предшествует цифра, а за ней следуют буквы как:

 $str = '12jan';

я использовал

$arr = preg_split('/(?<=[0-9])(?=[a-z]+)/i',$str);

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

$str='12 jan';
$str='12    jan';
$str='12/jan';
$str='12//jan';
$str='12/jan';
$str='12*/jan';
$str='12*//jan';

Код должен работать для любых приведенных выше строк, так что в конце дня у меня будет такой массив

Array
(
[0] => 12
[1] => jan
)

Любая помощь будет оценена.

3

Решение

Это может быть оптимизировано, если вы ответите на мой вопрос в комментарии.

Шаблон: ~(?<=[0-9])[*/ ]*(?=[a-z]+)~i

демонстрация

Выше будет соответствовать ноль или более *, / и / или пробелы.


На ваших входных строках это будет так же точно и быстрее:

Шаблон: ~\d+\K[^a-z]*~i
или же: ~\d+\K[*/ ]*~ (модификатор шаблона с учетом регистра не требуется)

демонстрация

Выше будет соответствовать ноль или более не алфавитных символов сразу после первой цифры (цифр).


И конечно preg_splitДвоюродные братья также могут сделать красиво:

Вот батарея PHP Демо.

$strings=['12jan','12 jan','12    jan','12/jan','12//jan','12/jan','12*/jan','12*//jan'];

foreach($strings as $string){
var_export(preg_split('~(?<=[0-9])[*/ ]*(?=[a-z]+)~i',$string));
echo "\n";
var_export(preg_split('~\d+\K[*/ ]*~',$string));
echo "\n";
var_export(preg_match('~(\d+)[/* ]*([a-z]+)~i',$string,$out)?array_slice($out,1):'fail');
echo "\n";
var_export(preg_match('~(\d+)[/* ]*(.+)~',$string,$out)?array_slice($out,1):'fail');
echo "\n";
var_export(preg_match_all('~\d+|[a-z]+~i',$string,$out)?$out[0]:'fail');
echo "\n---\n";
}

Все методы обеспечивают одинаковый вывод.

1

Другие решения

Это делает простое регулярное выражение preg_match:

foreach (['12 jan', '12    jan', '12/jan', '12//jan', '12/jan',
'12*/jan', '12*//jan'] as $test)
{
unset ($matches);
if (preg_match("#^([0-9]+)[ /*]*(.*)#", $test, $matches)) {
var_export( [$matches[1], $matches[2]] );
}
else {
print "Failed for '$test'.\n";
}
}

Регулярное выражение:

  • начать с цифр -> группа № 1
  • иметь 0 или более пробела, косой черты или звездочек
  • возьми все остальное -> группа № 2
0

Я обновил ваш код с помощью preg_match
Это дает вывод, что именно ваши потребности

$str='12/jan';
preg_match('/^(\d*)[\*\s\/]*([a-z]{3})$/i', $str, $match);
print_r($match);

но выход немного поменяется, будет как ниже

array(
0 => '12/jan',
1 => '12',
2 => 'jan'
)
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector