PHP разбивает строку на целочисленный элемент и строку
У меня есть строка сказать: Order_num = "0982asdlkj"
Как я могу разделить это на 2 переменные, с элементом number, а затем еще одну переменную с элементом letter в php?
Числовой элемент может быть любой длины от 1 до 4, скажем, а буквенный элемент заполняет все остальное, чтобы сделать каждый order_num длиной 10 символов.
Я нашел php explode
функция... но я не знаю, как сделать это в моем случае, потому что число чисел находится в диапазоне от 1 до 4 и буквы случайны после этого, поэтому нет способа разделить на конкретную букву. Пожалуйста, помогите как можно более конкретно!
6 ответов
Ты можешь использовать preg_split
используя lookahead и lookbehind:
print_r(preg_split('#(?<=\d)(?=[a-z])#i', "0982asdlkj"));
печать
Array
(
[0] => 0982
[1] => asdlkj
)
Это работает только в том случае, если буквенная часть действительно содержит только буквы и не содержит цифр.
Обновить:
Просто чтобы уточнить, что здесь происходит:
Регулярные выражения смотрят на каждую позицию и, если цифра перед этой позицией ((?<=\d)
) и письмо после него ((?=[a-z])
), затем он совпадает, и строка разбивается в этой позиции. Все это без учета регистра (i
).
Используйте preg_match() с регулярным выражением (\d+)([a-zA-Z]+)
, Если вы хотите ограничить количество цифр до 1-4 и букв до 6-9, измените его на (\d+{1,4})([a-zA-Z]{6,9})
,
preg_match("/(\\d+)([a-zA-Z]+)/", "0982asdlkj", $matches);
print("Integer component: " . $matches[1] . "\n");
print("Letter component: " . $matches[2] . "\n");
Выходы:
Integer component: 0982
Letter component: asdlkj
Вы также можете сделать это с помощью preg_split
разделив ваш ввод в точке, которая между цифрами и буквами:
list($num,$alpha) = preg_split('/(?<=\d)(?=[a-z]+)/i',$Order_num);
Вы можете использовать регулярное выражение для этого.
preg_match('/(\d{1,4})([a-z]+)/i', $str, $matches);
array_shift($matches);
list($num, $alpha) = $matches;
Проверь это
<?php
$Order_num = "0982asdlkj";
$split=split("[0-9]",$Order_num);
$alpha=$split[(sizeof($split))-1];
$number=explode($alpha, $Order_num);
echo "Alpha -".$alpha."<br>";
echo "Number-".$number[0];
?>
с уважением
wazzy
Мой предпочтительный подход был быsscanf()
потому что он лаконичен, не требует регулярных выражений, предлагает возможность приведения числового сегмента к целочисленному типу и не генерирует ненужных полных совпадений, таких какpreg_match()
.%s
однако полагается на тот факт, что в буквенном сегменте строки не будет пробелов.
$Order_num = "0982asdlkj";
var_export (
sscanf($Order_num, '%d%s')
);
Это также можно настроить для объявления отдельных переменных.
sscanf($Order_num, '%d%s', $numbers, $letters)
Если вы хотите использоватьpreg_
функция,preg_split()
является наиболее подходящим, но я бы не стал использовать дорогие обходные пути. Сопоставьте цифры, затем забудьте их (с\K
). Это разделит строку без использования каких-либо символов. Демо
var_export (
preg_split('/\d+\K/', $Order_num)
);
Чтобы присвоить переменные, используйте «деструктурирование симметричного массива».
[$numbers, $letters] = preg_split('/\d+\K/', $Order_num);
Помимо этих однофункциональных подходов, будет МНОГО двухфункциональных подходов, таких как:
$numbers = rtrim($Order_num, 'a..z');
$letters = ltrim($Order_num, '0..9');
Но я бы не стал использовать их в профессиональном сценарии, потому что им не хватает элегантности.