Имеется строка $s, в которую из формы передается введенный юзверем набор символов, содержащий структуры XXXX-XXXX, где X - шестнадцатиричная цифра. Структуры могут быть разделены чем угодно (пробел, пробел и запятая, просто запятая и прочим мусором). Требуется в массиве $a получить все введенные структуры. Например, код: Код (Text): $s = "1234-5678,1A2B-3C4D ABCD-EF90, 123"; ... for ($j = 0; $j < count($a); $j++) { echo "a[".$j."]=".$a[$j]; } должен напечатать: Пока что мне подсказали несколько кривой способ: Код (Text): $s=preg_replace("/[^A-F0-9-]+/"," ",$s); $a=explode(" ", $s); Здесь не проверяется число символов в структуре и чтобы '-' был посередине. Подскажите, пожалуйста, правильное решение?
{n} проверяет число последовательностей подпадающих под паттерн. соответственно нужна регулярка вида Код (Text): (разрешенные символы N раз - разрешенные символы N раз)
До этого я мануалы, конечно же, докопал. Пробовал вот так: PHP: preg_match_all("/[A-F0-9](4)[-][A-F0-9](4)+/",$s,$a); На выходе двумерный массив кажется, не очень понял, что к чему. Смотрел мануал по preg_match_all (извлечение телефонных номеров), такие регулярные выражения мой мозг пока не воспринимает (Php только начал изучать).
Во-первых, ошибка-то не выражения, а PHP Читать http://php.net/langref в частности как правильно записывать строки. (регулярки в PHP записываются как строка) Во-вторых, скобочки, для числа символов, не те.
Пока что получилось вытащить структуры по 9 символов 0-9, A-F и - без проверки, что - посередине: PHP: preg_match_all("/[A-F0-9-]{9}+/",$s,$aa,PREG_PATTERN_ORDER); $a = $aa[0]; Как все-таки правильно написать регулярку для XXXX-XXXX?
точно так же, но по алгоритму, который я давал выше. Для этого надо освоиться с подшаблонами и вот такими скобками ()
Хм, сейчас вроде заработал такой шаблон: "/[A-F0-9]{4}[-][A-F0-9]{4}+/". Или он неверен? Тесты вроде прокатывают как надо. До этого выдавал ошибку. Мейби. в другой части скрипта ошибка была...
Просто то, что я раньше цитировал, было из за отсутствия закрывающей кавычки в регулярке, это я поправил. А потом ошибки были из за того, что я ожидал одномерный массив на выходе, а получал двумерный. Надеюсь, что сейчас все правильно.