заголовки страниц

Статус
В этой теме нельзя размещать новые ответы.

absurdo

Участник
Регистрация
22 Мар 2007
Сообщения
317
Реакции
9
У меня есть список страниц моего сайта (около 8к). Как мне получить заголовок каждой страницы?
 
В смысле, все, что заключено в <title>...</title> у каждой страницы?
*** скрытое содержание ***

ого!... Никсов нет под рукой :-( Да, нужно в итоге получить список где напротив каждого УРЛ будет его title.
 
PHP:
<table>
<?php
$lines = file('1.txt');
foreach ($lines as $line_num => $line) {
$content = file_get_contents($line);
if(preg_match("|<title>(.*)</title>|siU",$content,$out)){
  echo '<tr><td>'.$line.'</td><td>'.$out[1].'</td></tr>';
}
?>
</table>
В файле 1.txt список сайтов. 1 строка - 1 сайт.
Выводить в таблице. Формат вывода:
| адрес сайте | имя сайт |
| адрес сайте | имя сайт |
| адрес сайте | имя сайт |
Могут быть ошибки.
 
absurdo
Я думал, у тебя список файлов и тебе нужно прямо на месте определить все заголовки. В действительности при наличии только кучи url, все будет гораздо медленнее + с пожиранием трафика. Если сайт действительно твой, и если он стоит на юникс, гораздо проще применить мой вариант. Иначе, конечно, стоит воспользоваться скриптом sw04, немного его изменив.

В файле 1.txt список сайтов. 1 строка - 1 сайт.
Выводить в таблице. Формат вывода:
| адрес сайте | имя сайт |
| адрес сайте | имя сайт |
| адрес сайте | имя сайт |
Могут быть ошибки.
Ошибки действительно есть. Во-первых, отсутствует закрывающая скобка цикла, а во-вторых,
Замечание: Каждая строка в полученном массиве будет завершаться символами конца строки, поэтому, если вам будет нужно избавиться от этих символов, вы будете должны использовать функцию rtrim().
Это из мана к функции file. Следовательно, нужно в дополнение юзать rtrim. Также в цикле определяется переменная $line_num, которая на самом деле нахрен не нужна. В итоге имеем следующий скрипт:
PHP:
<table>
<?php

$lines = file('1.txt');

foreach ($lines as &$line) {

        $line = rtrim($line);
        $content = file_get_contents($line);
        
        if (preg_match("|<title>(.*)</title>|siU", $content, $out)) {
                echo '<tr><td>'.$line.'</td><td>'.$out[1].'</td></tr>';
        }
}
?>
</table>
Для увеличения производительности и ускорения процесса можно прикрутить треды, а то и вовсе мультиплекс, но это я делать не буду :).
 
  • Заблокирован
  • #6
Если предыдущий скрипт не будет работать, значит у вас версия пхп ниже пятой, тогда надо &$line заменить на $line
 
Если в режиме совместимости стоит - ничего не придется дописывать.

А вообще такую фигню написали, кто вас учил построчное считывание файла так делат? :)

$fp = fopen('file.txt', 'r');

while($line = fgets($fp, 1024)) {
dosomething();
}

fclose($fp);
 
Если в режиме совместимости стоит - ничего не придется дописывать.

А вообще такую фигню написали, кто вас учил построчное считывание файла так делат? :)

$fp = fopen('file.txt', 'r');

while($line = fgets($fp, 1024)) {
dosomething();
}

fclose($fp);
Это ты фигню написал. Официальный ман пхп:
(PHP 4 >= 4.3.0, PHP 5)
file_get_contents -- Получить содержимое файла в виде одной строки
Описание
string file_get_contents ( string filename [, bool use_include_path [, resource context [, int offset [, int maxlen]]]] )

Данная функция идентична функции file() с той только разницей, что содержимое файла возвращается в строке, начиная с указанного смещения offset и до maxlen байтов. В случае неудачи, file_get_contents() вернёт FALSE.

Использование функции file_get_contents() наиболее предпочтительно в случае необходимости получить содержимое файла целиком, поскольку для улучшения производительности функция использует алгоритм 'memory mapping' (если поддерживается операционной системой).
Прежде чем вести конструктивный спор, необходимо прежде всего разобраться в предмете спора.
 
Wiltner,

я не хочу засорять топик, но ты понимаешь разницу между чтением файла в массив, и построчным чтением файла?

ЗАЧЕМ В ТВОЕМ КОДЕ file_get_contents, если ты выбираешь строку из массива? file_get_contents предназначен для чтения из файла всего содержимого в виде одной строки, file - в виде массива.

В своем коде ты из массива берешь строку, затем к этой строке применяешь file_get_contents, еще и пытаешься спорить.

Иди читай мануалы, я уже не говорю про то, что ты передаешь по ссылке аргумент (это код для пхп4, и в этом же коде ты используешь пхп5 specific функцию).
 
По порядку.
PHP:
$lines = file('1.txt');
В файле 1.txt находятся линки. Их мы считываем в массив для последующей обработки. Линков не миллион, не два, а всего-то 8к, чтобы делать какие-то ненужные оптимизаторские штуки. Считываю в массив, потому что мне так хочется. Никаких огромных объемов памяти для такого пустяка не надо, поэтому мне пофиг.

Далее. Функция file_get_contents, как известно, позволяет не только получить содержимое файла целиком, но и веб-страницу.
PHP:
$content = file_get_contents($line);
Все содержимое уже скачанной страницы (а в $line мы имеем веб-страницу) копируется в одну переменную, это делается для того, чтобы упростить последующее сравнивание регекспом всего одной переменной, безо всяких рид, массивов и т.д. После каждой итерации содержимое переменной перезаписывается, следовательно, ничего лишнего.

В своем коде ты из массива берешь строку, затем к этой строке применяешь file_get_contents, еще и пытаешься спорить.
Все верно. Беру строку из массива, т.е. линк, качаю его одной-единственной функцией в одну-единственную переменную, сравниваю регекспом шаблон с переменной. Все элементарно, все работает.

Иди читай мануалы, я уже не говорю про то, что ты передаешь по ссылке аргумент (это код для пхп4, и в этом же коде ты используешь пхп5 specific функцию).
Где написано или кто сказал, что этот код для пхп4/пхп5?

Теперь в общем. Как сказал Ларри Уолл, there is more than one way to do it. Это применимо ко всем языкам. Я руководствуюсь этим принципом, а на остальное мне насрать. Я кодер в первую очередь на перле, и во всем у меня перловые привычки. Приведенный код прекрасно работает. Что еще надо? Если кто-то хотел показать, что он лучше может что-то сделать, я его могу только поздравить. Иди и сделай, вместо того чтобы делать нелепые указания на несуществующие ошибки. Будь частью решения, а не частью проблемы. И все у тебя в жизни будет ок :).
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху