Я пытаюсь разбить строку с помощью preg_split. Вот пример строки:
111235622411
Я хочу, чтобы вывод был таким:
$arr[0] = "111";
$arr[1] = "2";
$arr[2] = "3";
$arr[3] = "5";
$arr[4] = "6";
$arr[5] = "22";
$arr[6] = "4";
$arr[7] = "11";
Так что, если есть один и тот же символ один за другим, я хочу, чтобы они были в том же «чанке». Я просто не могу придумать регулярное выражение, которое я должен использовать. Извините, если некоторые термины неверны, потому что прошло уже некоторое время с тех пор, как я кодировал PHP.
я хотел бы использовать preg_match_all()
:
$string = '111235622411';
preg_match_all('/(.)\1*/', $string, $matches);
var_dump($matches[0]);
\1
ссылается на ранее захваченную группу (.)
(любой отдельный символ). Эта функция называется обратная ссылка. Регулярное выражение повторяет ранее подобранный символ — жадный *
это означает, что оно соответствует как можно большему числу одинаковых символов, что и требовалось в вопросе.
Выход:
array(8) {
[0]=>
string(3) "111"[1]=>
string(1) "2"[2]=>
string(1) "3"[3]=>
string(1) "5"[4]=>
string(1) "6"[5]=>
string(2) "22"[6]=>
string(1) "4"[7]=>
string(2) "11"}
Вы можете использовать это регулярное выражение:
(.)(?=\1)\1+|\d
И вместо того, чтобы разделить это, возьмите спички.
$matches = null;
$returnValue = preg_match_all('/(.)(?=\\1)\\1+|\\d/', '111235622411', $matches);
И $matches[0]
будет содержать то, что вы хотите. Как сказал @ hek2mgl, вы также можете использовать более простой /(\d)\1*/
Ниже приведено простое решение, заключающееся в выполнении preg_match_all:
Регулярное выражение в этом случае:
(\d)\1*
Значение регулярного выражения:
PHP-код будет:
$re = "/(\\d)\\1*/";
$str = "111235622411";
preg_match_all($re, $str, $matches);
print_r($matches[0]);
Например, вы можете получить доступ к первой совпадающей группе «111» следующим образом: $ соответствует [0] [0], вторая «2», как эта $ соответствует [0] [1], и так далее. Проверьте здесь демонстрация увидеть рабочий пример.
Надеюсь, это полезно!