Помогите составить регулярку по сабжу. Как известно, диапозон IP-адресов с 0.0.0.0 по 255.255.255.255.
Получай Код (PHP): <span class="syntaxdefault"><br />$str </span><span class="syntaxkeyword">= </span><span class="syntaxstring">"255.255.255.255"</span><span class="syntaxkeyword">;<br /><br /></span><span class="syntaxdefault">$ip </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">get_ip</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$str</span><span class="syntaxkeyword">);<br /><br />function </span><span class="syntaxdefault">get_ip</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$subject</span><span class="syntaxkeyword">){<br /><br /></span><span class="syntaxdefault">$pattern </span><span class="syntaxkeyword">= </span><span class="syntaxstring">'/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/'</span><span class="syntaxkeyword">;<br /><br />if(</span><span class="syntaxdefault">preg_match</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$pattern</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$subject</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$octets</span><span class="syntaxkeyword">)){<br /> for(</span><span class="syntaxdefault">$i</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">; </span><span class="syntaxdefault">$i</span><span class="syntaxkeyword"><</span><span class="syntaxdefault">5</span><span class="syntaxkeyword">; </span><span class="syntaxdefault">$i</span><span class="syntaxkeyword">++){<br /> if(</span><span class="syntaxdefault">$octets</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">$i</span><span class="syntaxkeyword">] < </span><span class="syntaxdefault">0 </span><span class="syntaxkeyword">|| </span><span class="syntaxdefault">$octets</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">$i</span><span class="syntaxkeyword">] > </span><span class="syntaxdefault">255</span><span class="syntaxkeyword">)<br /> return </span><span class="syntaxdefault">FALSE</span><span class="syntaxkeyword">;<br /> }<br />return </span><span class="syntaxdefault">$octets</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">];<br />}<br />else<br /> return </span><span class="syntaxdefault">FALSE</span><span class="syntaxkeyword">;<br /><br />}<br /> </span><span class="syntaxdefault"></span>
так проще и быстрее проверять Код (Text): $str = "255.255.255.255"; if (ip2long($str) === false) { echo "IP <" . $str . "> плохой"; } else { echo "IP <" . $str . "> хороший"; } Добавлено спустя 18 минут 25 секунд: Код (Text): $str = "kkk265.255.255.255aaa127.5.3.5sss222.222.33.44"; $ip = get_ip($str); function get_ip($str){ $pattern = '#[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}#'; $b = preg_match_all($pattern, $str, $rows); if($b){ foreach($rows[0] as $row){ if (ip2long($row) === false) { echo "IP <" . $row . "> плохой<br>"; } else { echo "IP <" . $row . "> хороший<br>"; } } } }
Тогда уже так: Код (PHP): #[\d]{1,3}.[\d]{1,3}.[\d]{1,3}.[\d]{1,3}# Не надо тут так " \. ". И зачем делать лишнюю переменную $b? Код (PHP): if(preg_match_all($pattern,$str,$match)){ } А также лучше всего указать в: Код (PHP): foreach($match as $key => $value) { }
Экранирую, потому что точка относится к метасимволам Затем что считаю (для себя) плохим способом кодинга, когда в условии происходит присвоение: в условии должно быть условие, а не присвоение и сравнение. И при том, а если результат операции понадобится ещё несколько раз. Чем лучше, да и зачем? Ты только что выше отказался от создания лишней переменной )))
в третьем параметре мне пофик что =) ибо разговор идёт о возвращаемом значении функции, которое вы за каким-то хреном засовываете в переменную, которая будет использована лишь единожды. Это у вас какие-то глубинные страхи. Однако я тоже против присвоений в условиях. Просто это не тот случай.
Ну так я ради этого случая не буду же ведь менять свой стиль и свои принципы ))) Это всего-лишь маленький кусочек кода, мало ли как он будет дальше развиваться... Да и код лучше читается когда всё отдельно и по порядку А вот что касается "пофик", то именно третий параметр в дальнейшем используется и именно там создаётся массив $rows и туда всё складывается )))
твой принцип не относится к такому случаю. Скорее всего у тебя некое нечёткое понимание и недоверие к тому, как работают функции. Это уже не принцип. это функция пхп. она НИКАК не будет дальше развиваться. Она возвращает значение как написано в документации. Ты боишься возвращаемого значения, т.к. один из аргументов передаётся по ссылке.
Шаблон смотри. В php переменная это объект. Функция тем более возвращает "глобальную названную переменную массивом, когда выполнится", переменная указанная 3 параметром будет доступна ниже другого кода. Никакой нет выгоды создавать опять переменную. О каких может быть речь других применений, я не врубился) Быстрее проходит и выводит ключ и значение. Тем более массив передаешь с числовыми ключами.
Your, да уж подвели итог ))) можно так, можно по другому, где дело вкуса, где привычки, а где и "общепринятым" .. Проверял? Завтра, если будет время, протестирую.. а то как-то не верится =)
Your, возвращаюсь к твоему коду.. То ли я туплю, то ли что-то делаю не то Этот код foreach ($rows[0] as $value) возвращает это Код (Text): string(15) "265.255.255.255" string(9) "127.5.3.5" string(13) "222.222.33.44" А вот это foreach ($rows as $key => $value) возвращает это Код (Text): array(3) { [0]=>string(15) "265.255.255.255" [1]=>string(9) "127.5.3.5" [2]=>string(13) "222.222.33.44" } Так что это наверное не приемлемо тут, если только писать так foreach ($rows[0] as $key => $value) Но это вариант работает медленнее, на считанные миллисекунды, но медленнее
да это понятно. Вопрос был о приемлемости кода. А вот если получать и ключ и значение, то при объёме в миллион записей на это потратиться больше примерно на 0,1-0,15 секунды (это по моим расчётам). Это вообще ничто, но я точно знаю теперь что проход медленнее, т.к. лично проверил )))
регулярка которая проверяет и диапазоны элементов IP адреса. тоесть не пропустит некорректные адреса типа 256.958.210.25 Код (Text): ^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$
runcore, регулярка это очень медленный механизм, и если в ней много условий, то это только хуже. Если есть альтернативные функции, то нужно пользоваться ими
допустим есть текст в котором встречаются ip адреса. нужно выдрать из него все КОРРЕКТНЫЕ. какие альтернативные варианты вы предложите, чтобы они были быстрее одной регулярки? помимо скорости выполнения парсинга - немаловажно еще время потраченное на решение задачи. я напишу регулярку за пару минут и все - ЗАДАЧА решена! вы будете писать весь парсинг вручную, перебирать варианты, искать наиболее быстрый - в итоге выиграете пару микросекунд всего, зато потратите НЕДЕЛЮ. я за это время успею сделать в 10 раз больше другой работы - и заработать на этом, соответсвенно. не стоит забывать об этом. и не нужно вешать лапшу про тормознутость регулярок. они работают очень быстро, если уметь их писать. неверите? устройте тестирование. результаты вас удивят!
Не верю. Слова, слова, слова. Уже ни раз на этом форуме слышу подобное, но никто не прикладывает результаты тестирования. А я вот не ленюсь и тестирую. И очень часто бывает что оппонент не прав оказывается. А вот что касается 10 минут и неделя.. Да, я потрачу неделю, но при значительно увеличении нагрузки на сайт мои миллисекунды сослужат мне добрую славу. Добавлено спустя 9 минут 22 секунды: кстати, runcore, где-то ошибка в твоей регулярки. к примеру, 265.22.22.22 пропустит, но преобразует в 65.22.22.22 Добавлено спустя 27 минут 58 секунд: А вот теперь с уверенностью могу сказать, что регулярка runcore эффективнее (при условии если исправить ошибку) =) Вот тест Код (PHP): <?php $a = ''; $str = "kkk165.355.255.255aaa127.5.3.5sss222.222.33.44skds132.123.1.1w"; for ($i = 0; $i < 50000; $i++) { $a .= $str; } $str = $a; $pattern1 = '#[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}#'; $pattern2 = '#((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)#'; //************************************************** $start = microtime(true); preg_match_all($pattern1, $str, $rows); foreach ($rows[0] as $row) { if (ip2long($row) !== false) { $a = $row; } } echo round((microtime(true) - $start), 5); echo '<hr>';//************************************************** $start = microtime(true); preg_match_all($pattern2, $str, $rows); foreach ($rows[0] as $row) { $a = $row; } echo round((microtime(true) - $start), 5); //************************************************** а вот результат значение $i = 1000 первый вариант - 0.14503 второй вариант - 0.02137 значение $i = 10000 первый вариант - 1.34146 второй вариант - 0.22293 значение $i = 50000 первый вариант - 6.76594 второй вариант - 1.16916
Регулярки оч быстрые. Вобще пхп очень быстрый. И хватит экономить ресурсы компа. Пока нет нагрузки в миллион посетителей хватит из себя воображать фейсбук!
конечно Главное их с умом делать, а то можно просто всё убить одним махом... А с другой стороны, ты увидел два варианта решения и увидел результаты тестов, и хоть это и милли(микро), но выберешь который шустрее )))))