За последние 24 часа нас посетили 22445 программистов и 1037 роботов. Сейчас ищет 601 программист ...

Выделить из текста коды запчастей для автомобилей

Тема в разделе "Регулярные выражения", создана пользователем mxup, 11 мар 2019.

  1. mxup

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

    С нами с:
    8 сен 2014
    Сообщения:
    9
    Симпатии:
    0
    Здравствуйте, не пойму как реализовать следующий алгоритм. Ну что то очень похожее на регулярные выражения.
    Есть к примеру текст:
    Код (Text):
    1. Для данного автомобиля используются следующие запчасти: GHI837953, 66849Jd3, 76884754
    2. Так же существуют следующие аналоги фирмы Bosch: 78DJFHRUGF
    3. Или фирмы Samsung: 5659HDFF
    Надо чтобы регулярное выражение нашло все номера:
    GHI837953
    66849Jd3
    76884754
    78DJFHRUGF
    5659HDFF

    Кое каким методом, а именно я так понял с помощью поиска слова в котором есть не менее 5 цифр реализован следующий поиск номеров запчастей (не сочтите за рекламу, просто хочу показать как работает):
    http://www.partskatalog.ru/search-2.php
    Но например в моём случае с помощью этого сервиса не выцепляются такие номера как:
    78DJFHRUGF
    5659HDFF
    Потому что в этих словах нету 5 цифр.
    Вот как бы выцепить вообще все эти коды запчастей?
    У меня пока такое предположение, что нужно каждое слово как то сравнивать со словарём русского, английского языка и если там не присутствует это слово, то оно и есть искомое.
    Может кто ещё какие идеи подкинет?
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Слово, в обычном понимании, никогда не будет содержать даже одной цифры. Поэтому вам не нужно искать пять цифр, а хотя бы одну среди букв.
     
  3. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Как вариант - https://regex101.com/r/qG9kfJ/1

    PHP:
    1. <?php
    2. $str = 'Для данного автомобиля используются следующие запчасти: GHI837953, 66849Jd3, 76884754
    3. Так же существуют следующие аналоги фирмы Bosch: 78DJFHRUGF
    4. Или фирмы Samsung: 5659HDFF';
    5. if (preg_match_all('/(?<=\s|^)([\da-z]+(?:\d[a-z]|[a-z]\d|[\d])[\da-z]+)(?=\s|,|$)/i', $str, $matches)) {
    6.     print_r($matches[0]);
    7. }
     
    mxup нравится это.
  4. mxup

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

    С нами с:
    8 сен 2014
    Сообщения:
    9
    Симпатии:
    0
    Спасибо, а не могли бы ещё подсказать как поправить регулярное выражение, чтобы так же выцеплялись номера в которых содержится дефис?
    Например: 30500-48260
    И ещё почему то не выцеплляется такой номер: DK0
     
    #4 mxup, 12 мар 2019
    Последнее редактирование: 12 мар 2019
  5. mxup

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

    С нами с:
    8 сен 2014
    Сообщения:
    9
    Симпатии:
    0
    Поиск номеров с дефисом в принципе сам добавил
    Изменил
    Код (Text):
    1. preg_match_all('/(?<=\s|^)([\da-z]+(?:\d[a-z]|[a-z]\d|[\d])[\da-z]+)(?=\s|,|$)/i'
    на
    Код (Text):
    1. preg_match_all('/(?<=\s|^)([\da-z]+(?:\d[a-z-]|[a-z]\d|[\d])[\da-z]+)(?=\s|,|$)/i'
    А вот номер DK0 почему не ищется пока не понял
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Попробуйте так:
    PHP:
    1. preg_match_all('/(?<=\s|^)(?=.*[a-z])(?:[a-z0-9]|-(?!-)){3,}(?=\s|,|$)/i', $str, $matches);
    Но вам нужно как-то определить минимальное кол-во символов. В данном случае, я поставил 3 - {3,}
    --- Добавлено ---
    А вообще, история не нова. С регулярками такое часто случается - чем дальше в лес, тем толще партизаны. Возможно нужно идти более простым путем: разбить текст на слова (explode) и отфильтровать (array_filter), находя в каждом из слов необходимые признаки.
     
    mxup нравится это.
  7. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    mxup нравится это.
  8. mxup

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

    С нами с:
    8 сен 2014
    Сообщения:
    9
    Симпатии:
    0
    Вообще конечно интересно, есть ли какие то уже (может быть кем то написанные) функции, которые ищут все слова, которые представляют наборы символов и не относящиеся к словарю русского/английского языка?