Чтобы разбить мою строку в точке, которой предшествует цифра, а за ней следуют буквы как:
$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
)
Любая помощь будет оценена.
Это может быть оптимизировано, если вы ответите на мой вопрос в комментарии.
Шаблон: ~(?<=[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";
}
Все методы обеспечивают одинаковый вывод.
Это делает простое регулярное выражение 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";
}
}
Регулярное выражение:
Я обновил ваш код с помощью 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'
)