Измените четырехзначное число внутри строки и вставьте двоеточие - PullRequest
5 голосов
/ 06 апреля 2019

У меня есть строка, и я хочу изменить все 4-значные числа и вставить двоеточие между ними.Пример: 1320 станет 13: 20

$data = "The time is 1020 and the time is 1340 and 1550";

Я думаю использовать preg_match('/[0-9]{4}/', '????', $data);

Но не уверен, как снова передать то же значение в preg?

Ответы [ 2 ]

5 голосов
/ 06 апреля 2019

Одним из способов может быть использование preg_replace вместо этого и использование групп захвата для захвата 2 раз 2 цифры (\d{2})(\d{2}) между границами слова \b

При замене используйте 2 группы захвата, используя $1:$2

$data = "The time is 1020 and the time is 1340 and 1550";
$data = preg_replace('/\b(\d{2})(\d{2})\b/', "$1:$2", $data);
echo $data;

Результат:

The time is 10:20 and the time is 13:40 and 15:50

Php демо

3 голосов
/ 06 апреля 2019

Вам не нужно использовать группы захвата, вам просто нужно найти подходящие 4-значные подстроки и нацелиться на позицию нулевой длины в середине подстроки.

Код: ( Демо )

$data = "The time is 1020 and the time is 1340 and 1550";    
echo preg_replace('~\b\d{2}\K(?=\d{2}\b)~', ':', $data);

Выход:

The time is 10:20 and the time is 13:40 and 15:50

\b - это граница слова, которая обеспечивает совпадение первой цифры в последовательности
\d{2} соответствует первым двум цифрам
\K «перезапускает полное совпадение строк» ​​- фактически забывает две предыдущие цифры
(?=\d{2}\b) означает две цифры, за которыми не следует цифра.

preg_replace() заменяет позицию нулевой длины на двоеточие.


Если вы хотите улучшить проверку с помощью этой замены, вы можете указать некоторые известные диапазоны символов, например:

echo preg_replace('~\b[0-2]\d\K(?=[0-5]\d\b)~', ':', $data);

Конечно, вышесказанное не на 100% надежно, потому что оно соответствует времени, подобному 2900. Проверка всего между 0000 и 2400 становится значительно более опасной:

echo preg_replace('~\b(?:(?:(?:[01]\d|2[0-3])\K(?=[0-5]\d\b))|(?:24\K(?=00\b)))~', ':', $data);

* обратите внимание, мне не нравится включение 2400, но я прочитал аргументы, утверждающие, что это допустимое время. Вот почему я включаю это.

Если вы хотите опустить 2400 в качестве допустимого значения, тогда оно немного более управляемо (0000 - 2359):

echo preg_replace('~\b(?:[01]\d|2[0-3])\K(?=[0-5]\d\b)~', ':', $data);
...