Здравствуйте! Помогите разобраться с проблемой. Задача: отыскать IP-адреса в строке, где куча мусора. Есть сервер shoutcast 1.9.8. Есть сайт в локальной сети класса A, где у пользователей статический IP. В БД сайта хранятся IP-адреса юзеров. Сервер радио не выдает информацию об IP слушателей в "чистом" виде. От шауткаста я могу получить что-то вроде этого: Код (Text): 10.58.101.44WinampMPEG/5.62, Ultravox/2.1010990467710.143.44.124MPEG OVERRIDE01814689 Тут два слушателя с адресами: 10.58.101.44 и 10.143.44.124. Как мне вытащить эти IP в массив? Пробовал много чего, самое разумное, на мой непрофессиональный взгляд, было применить preg_match_all, но у меня не вышло, видимо неверно писал регулярное выражение. Код (Text): preg_match_all ('.*([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}.*', $listeners, $ips) А может и вовсе неуместно использовать здесь эту функцию. Мне пока не важна производительность, главное результат, пусть даже будет нагруженный гавнокод, т.е. возможны даже варианты типа: Код (Text): sql_query("SELECT ip FROM users WHERE ip != ''); с последующим поиском в строке в цикле каждого IP-адреса из запроса. Вообщем, направьте меня в нужное русло =)
Конкретно для твоего примера - такое работает: PHP: <?php $str = '10.58.101.44WinampMPEG/5.62, Ultravox/2.1010990467710.143.44.124MPEG OVERRIDE01814689'; preg_match_all('/10\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $str, $matches); print_r($matches); ?> IP-адреса же все с 10.*.*.* начинаются? Если после последней части IP адреса текст будет начинаться с цифры и при этом последняя часть состоит менее, чем из трёх цифр - то те 1 - 2 первые цифры, не являющаяся IP адресом - тоже будет захватываться.
Да, все начинаются на 10. Вот и проблема, что при таком раскладе будут захватываться лишние символы. Уже не удастся верно сделать поиск в базе по IP.
Проверяешь по базе то, что получилось найти. Определяешь и отделяешь там в массив отдельный те, которых нету в базе. Откидываешь от них последнюю цифру, проверяешь снова. Мне кажется, так проще будет.
П.С. Впередистоящие лишние цифры захватываться не будут, так как регулярка начинается с 10. , только если после ip есть цифры.