Как можно вырезать строку из html кода? Например мне нужна сотая строка из кода сайта yandex.ru как это можно реализовать и можно ли вообще это сделать?
http://manual.php.ru/ref.filesystem.html - Функции для работы с файловой системой там внизу полный список функций с описанием... а больше ничего и не нужно... например, если есть какой-нибудь текстовой файл, можно сделать вот так: Код (Text): <?php $array = @file("file.html"); // создаём массив, каждый элемент которого - строка в файле print ($array['100']); // выводим сотый элемент массива на экран, сотую строку ?>
PHP: <? $lines = file('http://www.yandex.ru'); print $lines[100]; ?> только это не кошерно. задача именно так стоит или чуть по другому?
Реально не кошерно ))) функция file(); работает достаточно медленно ... да и код какой-то примитивный )
Здорово. Только пашет при прямых адресах. А при урле типа http://www.yandex.ru/yandsearch?stype=&nl=0&text=123 уже не пашет
440hz Да, ты прав... чего-то побыстрее тут придумать нельзя... Хотя я бы наверное извратился и нарисовал бы конструкцию с ипользованием функции fopen(); дальше цыкл в котором бы использовалась функции fgets(); ну и т.д. просто влом сейчас код этот писать... так было бы красивее...
Hight старик ... ты думаешь что file() внутри работает на других фунциях? 1. ИМХО ты глубоко заблуждаешься ... 2. http:// запросы к ссылкм обрабатываются на уровне сокетов, а не на уровне файловой системы.
440hz Ладно, забей... Я шарю как это обрабатывается... И решений этой проблемы у меня в голове несколько... Но самый оптимальный вариант мы с тобой уже предложили...
440hz, Допустим страница состоит из 1000 строк HTML кода, а нам нужна только сотая. Так зачем нам считывать в оперативную память и парсить весь файл, а потом использовать только строку #100 (а именно так делает file()), если можно последовательно считать только 100 строк и дойдя до нужной прекратить чтение? При этом в каждый момент времени в оперативной памяти будет находиться не больше одной строки HTML кода. Думаю, что сомнений в том, что будет работать быстрее нету?
ONK а ты думаешь что fgets() читает строками? 8) глубочайшее заблуждение ... он возращает строку, а вот считыввает куда больше, чем тебе кажется. это раз. открывая http:// у тебя НЕТ возможности указать сколько прочитать. протокол вернет все сразу. тогда смысл извращаться если страница все равно зачитается вся? сдается мне у тебя полное непонимание как и что работает. 8)
Я бы мог сказать что это взаимно, но склонность делать преждевременные выводы иногда является показателем недостаточно глубоких познаний в теме, поэтому я воздержусь. 440hz, реализация работы fgets в ПХП может быть разная и я достоверно её не знаю. Но по разуму (предполагаю, что так оно и есть) в случае с HTTP запросом fopen должен открываться сокет на запрашиваемый сервер и отсылать туда соответствующий HTTP headers, а fgets должен считывать из него кусок до первого попавшегося NL символа или CRNL комбинации. При этом в оперативной памяти __скрипта__ находится только считанный кусок данных, хотя в буфере операционной системы для данного сокета уже может находиться и вся страница. Собственно это всё можно проверить написанием небольшого теста и измерением в процессе его исполнения занимаемой оперативной памяти (memory_get_usage()). Я бы сейчас и сделал это, но у меня нет доступа к ни к одному серверу с ПХП скомпилённым с лимитами на оперативную память.
ONK 1. ладно. не будем меряться сам знаешь чем. 8) 2. не там экономим или отпимизируем. все равно страница загрузиться вся, а чем ее уже читать дело личное. хоть file() хоть fgets(), но в случае запроса именно на 100 строку file удобнее, т.к. можно обратиться напрямую в массив. p.s. думаю задача стоит немного шире чем получить 100 строку и в этом случае иметь массив строк удобнее, но в случае с анализом контента страниц удобнее иметь вообще все в одном буфере и заниматься регулярками.
440hz, в принципе я согласен, но у меня есть личная неприязнь к file(). Массивы в ПХП жрут столько памяти, что загонять в них построчно большой файл стоит только при реальной необходимости в этом. Когда мне для некого анализа нужно всё содержимое страницы я предпочитаю использовать file_get_contents().