Вы можете убедиться, что это делают два или более шестнадцатеричных символа:
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)) {
...
}
Чтобы объяснить, как это работает,первое, что он делает, это проверяет (с положительным прогнозом, т. е. (?=...)
, что у вас есть ноль или более цифр или двоеточий, за которыми следует шестнадцатеричная буква, за которой следует ноль или более цифр или двоеточий, а затем буква.две шестнадцатеричные буквы в выражении.
После положительного взгляда находится исходное выражение, которое проверяет, что строка представляет собой пары шестнадцатеричных цифр.