Вставляйте разделители в строку через равные промежутки времени - PullRequest
1 голос
/ 29 августа 2010

У меня есть следующая строка в php:

$string = 'FEDCBA9876543210';

Строка может содержать 2 или более (я имею в виду больше ) шестнадцатеричных символа. Я хотел сгруппировать строку по 2:

$output_string = 'FE:DC:BA:98:76:54:32:10';

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

Любая помощь приветствуется1011 *

Ответы [ 5 ]

9 голосов
/ 29 августа 2010

Если вам не нужно проверять содержимое, для регулярного выражения нет смысла.

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

$outputString = chunk_split($string, 2, ":");
// generates: FE:DC:BA:98:76:54:32:10:

Возможно, вам придется удалить последний ":".

Или это:

$outputString = implode(":", str_split($string, 2));
// generates: FE:DC:BA:98:76:54:32:10

Ресурсы:

На ту же тему:

0 голосов
/ 07 апреля 2019

Хотя использование rtrim(chunk_split($string, 2, ':'), ':') не является ужасной практикой, я предпочитаю использовать прямые приемы, позволяющие избежать «зачистки» после внесения изменений.

Код: ( Демо )

$string = 'FEDCBA9876543210';
echo preg_replace('~[\dA-F]{2}(?!$)\K~', ':', $string);

Вывод:

FE:DC:BA:98:76:54:32:10

Регулярное выражение не пугает.Шаблон гласит:

[\dA-F]{2}   # match exactly two numeric or A through F characters
(?!$)        # that is not located at the end of the string
\K           # restart the fullstring match

Когда я говорю «перезапустить совпадение с полной строкой», я имею в виду «забыть ранее сопоставленные символы и начать сопоставление с этого момента».Поскольку после \K дополнительные символы не сопоставляются, шаблон эффективно доставляет позицию нулевой ширины, в которую необходимо вставить двоеточие.Таким образом, оригинальные символы не будут потеряны при замене.

0 голосов
/ 29 августа 2010

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

То, что вы хотите, просто, чтобы соответствовать группе несколько раз. Это довольно просто:

preg_match_all("/([a-z0-9]{2})+/i", $string, $matches);

Это заполнит $matches будет все вхождения двух шестнадцатеричных цифр (без учета регистра). Чтобы заменить их, используйте preg_replace:

echo preg_replace("/([a-z0-9]{2})/i", $string, '\1:');

Вероятно, в конце будет один символ ':', вы можете удалить его с помощью substr:

echo substr(preg_replace("/([a-z0-9]{2})/i", $string, '\1:'), 0, -1);
0 голосов
/ 29 августа 2010

Похоже, вы хотите регулярное выражение, как это:

/([0-9a-f]{2})/${1}:/gi

Что, в PHP это ...

<?php
$string = 'FE:DC:BA:98:76:54:32:10';
$pattern = '/([0-9A-F]{2})/gi';
$replacement = '${1}:';
echo preg_replace($pattern, $replacement, $string);
?>

Обратите внимание, что приведенный выше код в настоящее время не проверен.

0 голосов
/ 29 августа 2010

Вы можете убедиться, что это делают два или более шестнадцатеричных символа:

if (preg_match('!^\d*[A-F]\d*[A-F][\dA-F]*$!i', $string)) {
  ...
}

Нет необходимости в рекурсивном регулярном выражении.Кстати, рекурсивное регулярное выражение является противоречием в терминах.Обычный язык (который анализирует регулярное выражение) не может быть рекурсивным по определению.

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

if (preg_match('!^[\dA-F]{2}(?::[A-F][\dA-F]{2})*$!i', $string)) {
  ...
}

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

if (preg_match('!^(?=[\d:]*[A-F][\d:]*[A-F])[\dA-F]{2}(?::[A-F][\dA-F]{2})*$!i', $string)) {
  ...
}

Чтобы объяснить, как это работает,первое, что он делает, это проверяет (с положительным прогнозом, т. е. (?=...), что у вас есть ноль или более цифр или двоеточий, за которыми следует шестнадцатеричная буква, за которой следует ноль или более цифр или двоеточий, а затем буква.две шестнадцатеричные буквы в выражении.

После положительного взгляда находится исходное выражение, которое проверяет, что строка представляет собой пары шестнадцатеричных цифр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...