За последние 24 часа нас посетили 18824 программиста и 1652 робота. Сейчас ищут 974 программиста ...

Найти в строке структуры XXXX-XXXX и поместить их в массив

Тема в разделе "Регулярные выражения", создана пользователем Palych, 25 фев 2010.

  1. Palych

    Palych Активный пользователь

    С нами с:
    25 фев 2010
    Сообщения:
    11
    Симпатии:
    0
    Имеется строка $s, в которую из формы передается введенный юзверем набор символов, содержащий структуры XXXX-XXXX, где X - шестнадцатиричная цифра. Структуры могут быть разделены чем угодно (пробел, пробел и запятая, просто запятая и прочим мусором). Требуется в массиве $a получить все введенные структуры.
    Например, код:
    Код (Text):
    1. $s = "1234-5678,1A2B-3C4D ABCD-EF90, 123";
    2. ...
    3. for ($j = 0; $j < count($a); $j++)
    4. {
    5.  echo "a[".$j."]=".$a[$j];
    6. }
    должен напечатать:
    Пока что мне подсказали несколько кривой способ:
    Код (Text):
    1. $s=preg_replace("/[^A-F0-9-]+/"," ",$s);
    2. $a=explode(" ", $s);
    Здесь не проверяется число символов в структуре и чтобы '-' был посередине.
    Подскажите, пожалуйста, правильное решение?
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    {n} проверяет число последовательностей подпадающих под паттерн.
    соответственно нужна регулярка вида
    Код (Text):
    1. (разрешенные символы N раз - разрешенные символы N раз)
     
  3. Palych

    Palych Активный пользователь

    С нами с:
    25 фев 2010
    Сообщения:
    11
    Симпатии:
    0
    До этого я мануалы, конечно же, докопал. :)
    Пробовал вот так:
    PHP:
    1.  preg_match_all("/[A-F0-9](4)[-][A-F0-9](4)+/",$s,$a);
    На выходе двумерный массив кажется, не очень понял, что к чему.
    Смотрел мануал по preg_match_all (извлечение телефонных номеров), такие регулярные выражения мой мозг пока не воспринимает (Php только начал изучать).
     
  4. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Во-первых, ошибка-то не выражения, а PHP
    Читать http://php.net/langref в частности как правильно записывать строки. (регулярки в PHP записываются как строка)

    Во-вторых, скобочки, для числа символов, не те.
     
  5. Palych

    Palych Активный пользователь

    С нами с:
    25 фев 2010
    Сообщения:
    11
    Симпатии:
    0
    Про скобки тоже уже заметил.
    Ну а как в данном конкретном случае правильно написать?
     
  6. Palych

    Palych Активный пользователь

    С нами с:
    25 фев 2010
    Сообщения:
    11
    Симпатии:
    0
    Пока что получилось вытащить структуры по 9 символов 0-9, A-F и - без проверки, что - посередине:
    PHP:
    1. preg_match_all("/[A-F0-9-]{9}+/",$s,$aa,PREG_PATTERN_ORDER);
    2. $a = $aa[0];
    Как все-таки правильно написать регулярку для XXXX-XXXX?
     
  7. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    точно так же, но по алгоритму, который я давал выше.
    Для этого надо освоиться с подшаблонами и вот такими скобками ()
     
  8. Palych

    Palych Активный пользователь

    С нами с:
    25 фев 2010
    Сообщения:
    11
    Симпатии:
    0
    Хм, сейчас вроде заработал такой шаблон: "/[A-F0-9]{4}[-][A-F0-9]{4}+/". Или он неверен? Тесты вроде прокатывают как надо.
    До этого выдавал ошибку. Мейби. в другой части скрипта ошибка была...
     
  9. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
     
  10. Palych

    Palych Активный пользователь

    С нами с:
    25 фев 2010
    Сообщения:
    11
    Симпатии:
    0
    Просто то, что я раньше цитировал, было из за отсутствия закрывающей кавычки в регулярке, это я поправил.
    А потом ошибки были из за того, что я ожидал одномерный массив на выходе, а получал двумерный.
    Надеюсь, что сейчас все правильно.