Как взорвать строку любым целым числом? Regex? - PullRequest
4 голосов
/ 27 октября 2011

Кажется, это должно быть так просто, но регулярные выражения меня очень смущают. Я собираю переменные $ _GET, которые будут выглядеть как typeX, optionX, groupX и т. Д., Где X равно любому целому положительному целому числу. Затем мне нужно разделить строку на целое число, чтобы type1 стал массивом «type» и «1», однако type10 должен стать массивом «type» и «10», а не «type» и «1» и «0».

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

$array = preg_split("#\\d+#", $key, -1, PREG_SPLIT_NO_EMPTY);
print_r($array);

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

Array ( [0] => type )

Кроме того, я не уверен, что если бы это еще больше разделило число десять на единицу и ноль, чего я не хочу. Я чувствую, что это, вероятно, простое решение для ума, но я вращаюсь здесь кругами.

Ответы [ 3 ]

11 голосов
/ 27 октября 2011

Вы должны использовать флаг PREG_SPLIT_DELIM_CAPTURE, чтобы захватить группу, на которую вы сделали разделение. Вот пример:

<?php

$key= "group12";
$pattern = "/(\d+)/";

$array = preg_split($pattern, $key, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
print_r($array);

?>

Обратите внимание, что вы объединяете несколько флагов с помощью оператора | "побитовый или".

Выход:

Array
(
    [0] => group
    [1] => 12
)
2 голосов
/ 27 октября 2011

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

/(\D+)(\d+)/

Пример кода PHP:

<?php
$str = 'test189';
$pattern = '/(\D+)(\d+)/';

$res = preg_match_all($pattern, $str, $matches);
var_dump($matches);

?>
1 голос
/ 27 октября 2011

Используйте preg_match с захватом скобок:

<?php

$str = "type10";

$matches = array();

preg_match('/([a-zA-Z]+)(\d+)/', $str, $matches );

print_r($matches);

?>

Выходы:

Array(
    0 => "type10"
    1 => "type"
    2 => "10"
)

Затем, чтобы избавиться от первого элемента:

<?php
array_shift($matches);
print_r($matches);
?>

Дать:

Array(
    0 => "type"
    1 => "10"
)
...