За последние 24 часа нас посетили 16220 программистов и 1555 роботов. Сейчас ищут 811 программистов ...

Регулярка для тел. номеров

Тема в разделе "PHP для новичков", создана пользователем andreybugakov, 21 сен 2011.

  1. andreybugakov

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

    С нами с:
    27 июн 2011
    Сообщения:
    38
    Симпатии:
    0
    Здравствуйте!
    У меня есть часть строки вида
    Код (Text):
    1. <agent_phone>(4742) 11-11-11; 8-900-000-00-0</agent_phone>
    Мне нужно вычленить в массив номера телефонов, разделитель - точка с запятой
    У меня сейчас есть регулярка вида
    Код (Text):
    1. '/\<agent_phone\>(.*)\<\/agent_phone\>/'
    Подскажите, что вставить между тэгами?
     
  2. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Код (Text):
    1. ([\(\)\d\s;\-]+)
    Искать символы: (, ), числа, пробелы, точка с запятой, минус.

    Наверное.

    P.S. Или в коде ниже регулярки, делай
    PHP:
    1. <?
    2. if (strpos($match[1], ';')){
    3. echo 'Имеется точка с запятой';
    4. }
    5.  
    где $match это preg_match(_all)?($regexp, $string, $match)
     
  3. andreybugakov

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

    С нами с:
    27 июн 2011
    Сообщения:
    38
    Симпатии:
    0
    Не совсем то.
    Уточню: нужно найти все подстроки, находящиеся между разделителем. Разделителями могут являться: точка с запятой, запятая, два пробела, запятая с пробелом, точка с запятой с пробелом. разделителя может не быть вообще, если номер один.
     
  4. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    PHP:
    1. <?php
    2. $string = '<agent_phone>ss  (4742) 11-11-11; 8-900-000-00-0</agent_phone>';
    3.  
    4. preg_match("/\<agent_phone\>(.+)\<\/agent_phone\>/", $string, $matches);
    5. $phones = preg_split('/([;\.,]|\s{2,})/', $matches[1]);
    6. print_r($phones);
    7.  
     
  5. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Тогда:
    Код (Text):
    1. '/\<agent_phone\>(.*)\<\/agent_phone\>/'
    и
    PHP:
    1. <?
    2. $array = array_map('trim', preg_split('/[;,]?[\s]{2,}/', $match[1]));
    3.  
     
  6. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    lexa
    я бы, вместо трим (не понимаю как он у тебя работает) воспользовался бы второй регуляркой, которая привела бы все номера телефонов к единому стандарту
     
  7. andreybugakov

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

    С нами с:
    27 июн 2011
    Сообщения:
    38
    Симпатии:
    0
    topas
    Большое спасибо, сделал как ты сказал и обрезал затем пробелы. Теперь то, что надо))

    А подскажешь, как потом удалить все символы, кроме цифр из номера? Это лучше сделать регуляркой или посимвольным перебором?
     
  8. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    topas, trim() просто всему массиву делается. Ведь в условии "точка с запятой или запятая" не учитываются пробелы по бокам (кроме два и больше справа).

    andreybugakov,
    PHP:
    1. <?
    2. $numbers = preg_replace('/\D/', '', $match[1]);
    3.