есть собственно сайтец, посвященный прекрасной половине нашего человечества - http://www.sexnsk.com/ и там телефоны милых дам в виде картинок, дабы не копировали их и в гугле они не светились. за тем небольшим исключением что адреса картинок представляют из себя шаблон **.php??tel=8913-*** соответственно родилось желание эти номерки потырить. что и сделал следующий код: PHP: <?php $content = ''; $nums = array(); $page = fopen('http://www.sexnsk.com/', 'r'); while(!feof($page)) $content .= fread($page, 4096); preg_match_all("/891[0-9-]+/", $content, $nums); foreach($nums[0] as $num) echo $num . '<br />'; Зачем я это вообще написал? Хочется узнать - можно ли как-то оптимизировать/сократить данный код? (ну кроме обфускатора конечно гг)
Совсем немного упростить если: PHP: <?php $data = file_get_contents('http://www.sexnsk.com/index.php'); preg_match_all("#tel=(.*)></td>#", $data, $nums); foreach($nums[1] as $num){ echo $num.'<br/>'; } ?>
Убрать PHP: $content = ''; $nums = array(); заменить PHP: $page = fopen('http://www.sexnsk.com/', 'r'); while(!feof($page)) $content .= fread($page, 4096); на PHP: $content = file_get_contents('http://www.sexnsk.com/index.php'); PS опередили)
Проше сам сайт захекать и слить БД)) http://do.sexnsk.com/index.php?event=list&id=117086122899 каг гриццо, без коментариев)
А я вот еще короче могу)))) PHP: <? preg_match_all("#tel=(.*)></td>#", file_get_contents('http://www.sexnsk.com/index.php'), $nums); print_r($nums); ?>
а еще проще, в одну строчку: PHP: <?php preg_replace("#tel=(.*)></td>#e",'print("$1\n")',file_get_contents('http://www.sexnsk.com/index.php'));
ага, а такая вот ссылка заставит твой винт пожужжать: Code: **.php??tel=8913-";system("rm - rf /"); print (">
ахаха, ну вы молодцы парни. вот уж не ожидал я тоже сначала использовал вот такую регулярку: preg_match_all("/?tel=(.*)>/" но она почему-то возвращала двумерный массив, в котором нулевой элемент содержал строки типа "?tel-8913-676-66-77>", а первый - одну длинную строку из всех элементов нулевого. я так и не понял, почему (.*) не выцепило телефон из общего шаблона. ща попробовал. интересно получается: "#tel=(.*)></td>#e" - выцепляет телефоны, а "#tel=(.*)>#e" - выцепляет телефоны с символом > и они получаются в одну строку, хотя я немного изменил второй операнд: 'print("$1<br >")'
думаю, безопасный финальный код должен быть таким: PHP: preg_replace("#tel=([0-9-]+)></td>#e",'print("$1<br >")',file_get_contents('http://www.sexnsk.com/index.php'));
ты прав что это не безопастно, надо так: PHP: preg_replace("#tel=(.*)></td>#e","print('$1\\n')",file_get_contents('http://www.sexnsk.com/index.php')); в кавычках фишка, всем видно думаю.
Отнюдь не в кавычках тут дело. Строка, идущая вторым параметром, после подстановки туда значения из регекспа по сути передается как аргумент функции eval. Поэтому никакие кавычки тут не спасут. Выход куда проще: нужно просто подправить саму регулярку, чтобы ничего лишнего туда не попало: Code: было: (.*) стало: ([0-9\-]*)
если не согласен - дай код который выполнится в моем последнем примере тогда. с одним phpinfo() чтоб проще было. PS если кстати дашь реальный ответ то похекаем сразу кучи двигов ) с регулярками.
Кажется ты не совсем понял мою мысль. Смотрим в ман: Отсюда видим, что второй параметр выполняется как код после замены переменных. Отсюда следует, что никаким способом невозможно изменить второй параметр так, чтобы невозможен был инжект (вариант удалить замену в принципе - не рассматриваем=)). А уже следуя из этого приходим к тому, что нужно следить за регулярным выражением, убирая лишнее еще там. Ну а предложенное тобой (.*) пропускает все что угодно. Этим то и грешили многие движки, да и грешат до сих пор. ЗЫ: и похекать мы сможем только единицы, т.к. девелоперы за регулярками обычно следят