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

http://ideone.com/SKtKs

Вы также можете сделать это с помощью 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');

Но я бы не стал использовать их в профессиональном сценарии, потому что им не хватает элегантности.

Другие вопросы по тегам