Здравствуйте, не пойму как реализовать следующий алгоритм. Ну что то очень похожее на регулярные выражения. Есть к примеру текст: Код (Text): Для данного автомобиля используются следующие запчасти: GHI837953, 66849Jd3, 76884754 Так же существуют следующие аналоги фирмы Bosch: 78DJFHRUGF Или фирмы Samsung: 5659HDFF Надо чтобы регулярное выражение нашло все номера: GHI837953 66849Jd3 76884754 78DJFHRUGF 5659HDFF Кое каким методом, а именно я так понял с помощью поиска слова в котором есть не менее 5 цифр реализован следующий поиск номеров запчастей (не сочтите за рекламу, просто хочу показать как работает): http://www.partskatalog.ru/search-2.php Но например в моём случае с помощью этого сервиса не выцепляются такие номера как: 78DJFHRUGF 5659HDFF Потому что в этих словах нету 5 цифр. Вот как бы выцепить вообще все эти коды запчастей? У меня пока такое предположение, что нужно каждое слово как то сравнивать со словарём русского, английского языка и если там не присутствует это слово, то оно и есть искомое. Может кто ещё какие идеи подкинет?
Слово, в обычном понимании, никогда не будет содержать даже одной цифры. Поэтому вам не нужно искать пять цифр, а хотя бы одну среди букв.
Как вариант - https://regex101.com/r/qG9kfJ/1 PHP: <?php $str = 'Для данного автомобиля используются следующие запчасти: GHI837953, 66849Jd3, 76884754 Так же существуют следующие аналоги фирмы Bosch: 78DJFHRUGF Или фирмы Samsung: 5659HDFF'; if (preg_match_all('/(?<=\s|^)([\da-z]+(?:\d[a-z]|[a-z]\d|[\d])[\da-z]+)(?=\s|,|$)/i', $str, $matches)) { print_r($matches[0]); }
Спасибо, а не могли бы ещё подсказать как поправить регулярное выражение, чтобы так же выцеплялись номера в которых содержится дефис? Например: 30500-48260 И ещё почему то не выцеплляется такой номер: DK0
Поиск номеров с дефисом в принципе сам добавил Изменил Код (Text): preg_match_all('/(?<=\s|^)([\da-z]+(?:\d[a-z]|[a-z]\d|[\d])[\da-z]+)(?=\s|,|$)/i' на Код (Text): preg_match_all('/(?<=\s|^)([\da-z]+(?:\d[a-z-]|[a-z]\d|[\d])[\da-z]+)(?=\s|,|$)/i' А вот номер DK0 почему не ищется пока не понял
Попробуйте так: PHP: preg_match_all('/(?<=\s|^)(?=.*[a-z])(?:[a-z0-9]|-(?!-)){3,}(?=\s|,|$)/i', $str, $matches); Но вам нужно как-то определить минимальное кол-во символов. В данном случае, я поставил 3 - {3,} --- Добавлено --- А вообще, история не нова. С регулярками такое часто случается - чем дальше в лес, тем толще партизаны. Возможно нужно идти более простым путем: разбить текст на слова (explode) и отфильтровать (array_filter), находя в каждом из слов необходимые признаки.
Найдет все от сюда - $str='firm Samsung 5659HDFF'; https://php.ru/manual/regexp.reference.conditional.html
Вообще конечно интересно, есть ли какие то уже (может быть кем то написанные) функции, которые ищут все слова, которые представляют наборы символов и не относящиеся к словарю русского/английского языка?