За последние 24 часа нас посетили 22495 программистов и 1008 роботов. Сейчас ищут 757 программистов ...

Вопрос

Тема в разделе "Прочие вопросы по PHP", создана пользователем Lomaster, 5 мар 2006.

  1. Lomaster

    Lomaster Активный пользователь

    С нами с:
    20 фев 2006
    Сообщения:
    6
    Симпатии:
    0
    Как можно вырезать строку из html кода? Например мне нужна сотая строка из кода сайта yandex.ru как это можно реализовать и можно ли вообще это сделать?
     
  2. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    http://manual.php.ru/ref.filesystem.html - Функции для работы с файловой системой

    там внизу полный список функций с описанием... а больше ничего и не нужно...

    например, если есть какой-нибудь текстовой файл, можно сделать вот так:

    Код (Text):
    1. <?php
    2.  $array = @file("file.html"); // создаём массив, каждый элемент которого - строка в файле
    3.  print ($array['100']); // выводим сотый элемент массива на экран, сотую строку
    4. ?>
     
  3. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    PHP:
    1. <?
    2. $lines = file('http://www.yandex.ru');
    3. print $lines[100];
    4. ?>
    только это не кошерно. задача именно так стоит или чуть по другому?
     
  4. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Реально не кошерно ))) функция file(); работает достаточно медленно ... да и код какой-то примитивный )
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Hight
    что значит медленно? есть что-то быстрее? 8)))
    это какой код примитивный?
     
  6. Lomaster

    Lomaster Активный пользователь

    С нами с:
    20 фев 2006
    Сообщения:
    6
    Симпатии:
    0
  7. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    440hz

    Да, ты прав... чего-то побыстрее тут придумать нельзя... Хотя я бы наверное извратился и нарисовал бы конструкцию с ипользованием функции fopen(); дальше цыкл в котором бы использовалась функции fgets(); ну и т.д. просто влом сейчас код этот писать... так было бы красивее...
     
  8. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Hight
    старик ... ты думаешь что file() внутри работает на других фунциях?
    1. ИМХО ты глубоко заблуждаешься ...
    2. http:// запросы к ссылкм обрабатываются на уровне сокетов, а не на уровне файловой системы.
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    - не люблю кошек ...
    - это потому, что не умеешь их готовить!
     
  10. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    440hz
    Ладно, забей... Я шарю как это обрабатывается... И решений этой проблемы у меня в голове несколько... Но самый оптимальный вариант мы с тобой уже предложили...
     
  11. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Hight
    судя по вопросу парню нужен curl.
     
  12. ONK

    ONK Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    440hz, Допустим страница состоит из 1000 строк HTML кода, а нам нужна только сотая. Так зачем нам считывать в оперативную память и парсить весь файл, а потом использовать только строку #100 (а именно так делает file()), если можно последовательно считать только 100 строк и дойдя до нужной прекратить чтение? При этом в каждый момент времени в оперативной памяти будет находиться не больше одной строки HTML кода.
    Думаю, что сомнений в том, что будет работать быстрее нету?
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ONK
    а ты думаешь что fgets() читает строками? 8) глубочайшее заблуждение ... он возращает строку, а вот считыввает куда больше, чем тебе кажется. это раз.

    открывая http:// у тебя НЕТ возможности указать сколько прочитать. протокол вернет все сразу. тогда смысл извращаться если страница все равно зачитается вся?

    сдается мне у тебя полное непонимание как и что работает. 8)
     
  14. ONK

    ONK Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    Я бы мог сказать что это взаимно, но склонность делать преждевременные выводы иногда является показателем недостаточно глубоких познаний в теме, поэтому я воздержусь. ;)

    440hz, реализация работы fgets в ПХП может быть разная и я достоверно её не знаю. Но по разуму (предполагаю, что так оно и есть) в случае с HTTP запросом fopen должен открываться сокет на запрашиваемый сервер и отсылать туда соответствующий HTTP headers, а fgets должен считывать из него кусок до первого попавшегося NL символа или CRNL комбинации. При этом в оперативной памяти __скрипта__ находится только считанный кусок данных, хотя в буфере операционной системы для данного сокета уже может находиться и вся страница.
    Собственно это всё можно проверить написанием небольшого теста и измерением в процессе его исполнения занимаемой оперативной памяти (memory_get_usage()). Я бы сейчас и сделал это, но у меня нет доступа к ни к одному серверу с ПХП скомпилённым с лимитами на оперативную память.
     
  15. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ONK
    1. ладно. не будем меряться сам знаешь чем. 8)
    2. не там экономим или отпимизируем. все равно страница загрузиться вся, а чем ее уже читать дело личное. хоть file() хоть fgets(), но в случае запроса именно на 100 строку file удобнее, т.к. можно обратиться напрямую в массив.

    p.s. думаю задача стоит немного шире чем получить 100 строку и в этом случае иметь массив строк удобнее, но в случае с анализом контента страниц удобнее иметь вообще все в одном буфере и заниматься регулярками.
     
  16. ONK

    ONK Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    440hz, в принципе я согласен, но у меня есть личная неприязнь к file(). Массивы в ПХП жрут столько памяти, что загонять в них построчно большой файл стоит только при реальной необходимости в этом.
    Когда мне для некого анализа нужно всё содержимое страницы я предпочитаю использовать file_get_contents().
     
  17. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Дай руку пожму...
     
  18. ONK

    ONK Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    Hight, а ты не кусаешься?
    /*...спрашивает, с подозрением протягивая руку...*/
     
  19. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    ONK
    Ну вообще могу укусить... Но это недокументированная функция...