Пакетная обработка HTML файлов

Форум для тех кто начинает осваивать язык php.
Аватара пользователя
Slash
Администратор
Сообщения: 2028
Поблагодарили: 62 раза

Re: Пакетная обработка HTML файлов

Сообщение Slash » Чт авг 04, 2016 5:42 pm

vihtor писал(а):Нужен готовый код.

С таким подходом вам на фриланц. За деньги можете требовать готовое решение.
Реклама
Аватара пользователя
vihtor
Сообщения: 112
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Пакетная обработка HTML файлов

Сообщение vihtor » Чт авг 04, 2016 8:21 pm

Ну вы даёте. Cтолько! проделали бесплатно работы и на тее...
Как в той пословице: "Плыли - плыли, а на берегу обка..лись".
Когда говорят о деньгах меня это бесит. Я закрываю такую страницу, не читая....
На другом форуме мне доделают скрипт, с удовольствием. Ещё и поблагодарят за тему (читай за раскрутку форума).
Аватара пользователя
Slash
Администратор
Сообщения: 2028
Поблагодарили: 62 раза

Re: Пакетная обработка HTML файлов

Сообщение Slash » Чт авг 04, 2016 8:32 pm

Мне ваши деньги не нужны, я за свои ответы денег не беру. Я говорю о вашем тоне, сказано так, будто ТЗ, а не просьба.
vihtor писал(а):Когда говорят о деньгах меня это бесит.

Не сомневаюсь.
vihtor писал(а):На другом форуме мне доделают скрипт, с удовольствием.

Да ради Бога. Я вас не держу.
vihtor писал(а):Ещё и поблагодарят за тему (читай за раскрутку форума).

Это вам бы научиться говорить "спасибо". Да и узнать что ни будь о раскрутке, прежде чем что то подобное писать, но, вам виднее.
Всего доброго.
Аватара пользователя
vihtor
Сообщения: 112
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Пакетная обработка HTML файлов

Сообщение vihtor » Чт авг 04, 2016 8:58 pm

Да, что Вы, Боже упаси. Я и не подозревал, что разговариваю в плохом тоне. Никаких требований я не выдвигаю. Только просьбы. Извините.
Я Вам очень благодарен за Ваш Труд. Действительно Вы классно! сделали скрипт.
Спасибо!!
Буду использовать Ваш скрипт как есть. Это же лучше, чем вообще на страницах нет <meta name="description" content="">
Аватара пользователя
Slash
Администратор
Сообщения: 2028
Поблагодарили: 62 раза

Re: Пакетная обработка HTML файлов

Сообщение Slash » Чт авг 04, 2016 9:11 pm

Допилил сценарий. Работу не проверял, но он должен убирать кавычки " и «» (если надо ещё какой то символ удалить из описания, просто добавляйте его в массив array('"', '«', '»')). Добавил проверку на целое слово, теперь разрыва слова не должно быть.

Код: Выделить всё

<?php
$dir   
= '.';
$files = scandir($dir);
foreach ($files as $file)
{
    if (preg_match('/\.(html|php)/', $file))
    {
        $html = file_get_contents($dir . '/' . $file);
        if (preg_match('|<body>|', $html))
        {
            preg_match('|<body>(.*?)</body>|su', $html, $body);
            $description = preg_replace('|<h1>(.*?)</h1>|su', '', $body[1]);
            $description = strip_tags($description);
            $description = str_replace(array("\r\n", "\r", "\n"), ' ', $description);
            $description = str_replace(array('"', '«', '»'), '',       $description);
            $description = trim($description);
            $description = '<meta name="description" content="' . mb_substr($description, 0, mb_strpos($description, ' ', 255)) . '">' . "\n" . '</head>';
            $html = preg_replace('|</head>|u', $description, $html);

            $fopen = fopen($dir . '/' . $file, 'w');
            $write = fwrite($fopen, $html);
            fclose($fopen);
        }
    }

Просто скопируйте и вставьте в файл.
Аватара пользователя
vihtor
Сообщения: 112
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Пакетная обработка HTML файлов

Сообщение vihtor » Пт авг 05, 2016 2:07 am

Благодарю вас, но появились другие проблемы.
Протестировал скрипт на двух сайтах. На бесплатном хостинге и платном. Результат одинаковый.
Такая ошибка:
Warning: mb_strpos() [function.mb-strpos]: Offset not contained in string in /home/a6101682/public_html/name_file.php on line 17

Это та же строка, на которую ругался браузер и в предыдущей версии скрипта.

Описание в браузере выглядит так:
Задума�ись над поиском новой работы? Но прощаться с нынешней пока не собираетесь? От�ичный п�ан! Однако он сработает, то�ько ес�и соб�юдать э�ементарные

При копировании и сохранении этого текста я Блокноте пишет: "Этот файл содержит текст в формате Юникод..."

Затем я скачал, Website Copier-ом, тестируемый сайт на компьютер. Думал произойдёт чудо. Ан нет. Notepad++ видит Описание так:
Задумаѐّ‘̠над поиском новой работы? Но прощаться с нынешней пока не собираетесь? ОтѐّȐޑ̐٠пѐѐݡ Однако он сработает, тоё͐ېޠесѐؠсобёϐՐёÑ̠эѐ֐ݐ֐ޑÐёPޑ̐

Значит поисковики видят искажённый текст. Как же решить эту проблему?

И ещё. meta name="description" content="" генерируется перед тегом </head> , т.е. низко в коде.
Но между тегами </title> и </head> у меня куча линков, скриптов и т.д. Как бы сделать, чтобы данный мета-тег с Описанием генерировался непосредственно после тега </title> ?
Аватара пользователя
Slash
Администратор
Сообщения: 2028
Поблагодарили: 62 раза

Re: Пакетная обработка HTML файлов

Сообщение Slash » Пт авг 05, 2016 9:07 am

vihtor писал(а):Warning: mb_strpos() [function.mb-strpos]: Offset not contained in string in /home/a6101682/public_html/name_file.php on line 17

Как то связано с количеством символов...
Вопрос с вопросиками в квадратиках и каракуль - проблема кодировки.
Как вам такой вариант:

Код: Выделить всё

<?php
$dir   
= '.';
$files = scandir($dir);
$cnt   = 0;
$lists = array();
foreach ($files as $file)
{
    if (preg_match('/\.(html|php)/', $file) && $file != basename(__FILE__))
    {
        $html = file_get_contents($dir . '/' . $file);
        if (preg_match('|<body>|', $html))
        {
            $cnt++;
            preg_match('|<body>(.*?)</body>|su', $html, $body);
            $description = preg_replace('|<h1>(.*?)</h1>|su', '', $body[1]);
            $description = strip_tags($description);
            $description = str_replace(array("\r\n", "\r", "\n"), ' ', $description);
            $description = str_replace(array('"', '«', '»'), '',       $description);
            $description = trim($description);
            $description = preg_replace('|( ){2,}|', '$1', $description);
            $description = mb_substr($description, 0, mb_strrpos(mb_substr($description, 0, 255), ' '));
            $content     = '</title>' . "\n" . '<meta name="description" content="' . $description . '">';
            $html = preg_replace('|</title>|u', $content, $html);

            $fopen = fopen($dir . '/' . $file, 'w');
            $write = fwrite($fopen, $html);
            fclose($fopen);

            $lists[] = 'Описание в файле: <strong>' . $file . '</strong>: ' . $description . '<br />';
        }
    }
}

echo 'Всего файлов: <strong>' . $cnt . '</strong><br />';
foreach ($lists as $list)
{
    echo $list;

Учел и поправил:
  • Пожелание переместить описание после заголовка <title> (на самом дели роли ни какой не играет).
  • Исправлена ошибка: Warning: mb_strpos() [function.mb-strpos]: Offset not contained in string in.
  • Удалены два и более идущих подряд пробела.
  • Отображения редактируемых файлов (в виде списка) и текст описания на против (при выполнении сценария).
Просто скопировать и вставить в файл, с учетом того, что сценарий будет находиться в одной директории вместе с редактируемыми файлами.

Результат выполнения сценария:
Пакетная обработка HTML файлов - Описание.jpg
 

Код: Выделить всё

<title>6 правилкак искать новую работуне увольняясь со старой</title>
<
meta name="description" content="Задумались над поиском новой работы? Но прощаться с нынешней пока не собираетесь? Отличный план! Однако он сработает, только если соблюдать элементарные правила поиска. Мысли о смене работы не посещают того работника, которого все устраивает в">
 
Аватара пользователя
vihtor
Сообщения: 112
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Пакетная обработка HTML файлов

Сообщение vihtor » Пт авг 05, 2016 11:11 am

Эта версия скрипта работает отлично, собственно, как и предыдущая.
Но вот это осталось по-прежнему: "Вопрос с вопросиками в квадратиках и каракуль - проблема кодировки."

Открываю браузером файл со скриптом на компьютере - нормально.
Запускаю на сервере - уже изначально отображаются надписи в неправильной кодировке. Если перезагрузить (обновить) страницу, появляются правильные надписи. Но тогда сайт вообще не открывается, ни одна страница. Просто пустые страницы.

Также запускал скрипт браузером K-Meleon.Там есть настройка: Кодировка - Автоопределение - Универсальная. Скрипт запустился в правильной кодировке. Но в Описаниях страниц, опять таки непонятные символы.

Если предположить, что проблема с сервером, но я также тестировал скрипт и на платном сайте. Он уже проиндексирован поисковиками. И ПС выводят сниппет правильно, хотя нет там Описаний. Значит на страницах проблем нет.

Как решить эту проблему?

Отправлено спустя 45 минут 35 секунд:
Спешу поделиться радостью! Скрипт работает на все 100.
Наконец-то я, идиот, догадался открыть код скрипта в Notepad++ и преобразовать содержимое в кодировке UTF-8 без BOM, что очень важно. Ведь копируется код отсюда с форума с невидимыми символами, которые нужно убрать.
Эх, ещё бы в конце Описаний добавлялись троеточие... Ну точь как ПС генерирует сниппет. Но это уже понты. Это я так, сам с собой разговариваю, на радостях Не обращайте внимание.

Огромное спасибо Вам. Извините, что было не так.. Всё, РАБОТАЮ....
Аватара пользователя
Slash
Администратор
Сообщения: 2028
Поблагодарили: 62 раза

Re: Пакетная обработка HTML файлов

Сообщение Slash » Пт авг 05, 2016 3:31 pm

Я рад, что смог помочь.
vihtor писал(а):Ведь копируется код отсюда с форума с невидимыми символами, которые нужно убрать.

Нет. Дело не в этом форуме.
vihtor писал(а):Эх, ещё бы в конце Описаний добавлялись троеточие...

Можно в эту строчку:

Код: Выделить всё

            $content     = '</title>' . "\n" . '<meta name="description" content="' . $description . '">';

Добавить троеточие, например, так:

Код: Выделить всё

            $content     = '</title>' . "\n" . '<meta name="description" content="' . $description . '...">';
Аватара пользователя
vihtor
Сообщения: 112
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Пакетная обработка HTML файлов

Сообщение vihtor » Вс авг 07, 2016 11:37 am

Упёрся в проблему. Нужен такой же скрипт, но под кодировку win-1251. Может возможно из этой версии скрипта сделать подобную под данную кодировку.

Ещё нашел вот такой скрипт. Но, он работает на сервере с php 5.4, а у меня даже платный хостинг - 5.3.
Прошу прокомментировать этот скрипт:

Код: Выделить всё

<?
    
    
session_start();
    
    
error_reporting(E_ALL);
    
    
define('ROOT'dirname(__FILE__));
    
    if (!empty(
$_SERVER['QUERY_STRING']))
    {
        
$file strip_tags($_SERVER['QUERY_STRING']);
    }
    else 
$file 'index.html';
    
    function 
goHome()
    {
        
header('HTTP/1.1 404 NotFound');
        
header('Location:/');
    }
    
    if (
file_exists(ROOT '/' $file) && strpos($file'.html') > -1
    {
        
ob_start();
        
ob_flush();
        include_once(
ROOT '/' $file);
        
$data ob_get_contents();
        
ob_end_clean();
        
        if (isset(
$data))
        {
           
$desc preg_match('#</table>(.*)<b#ism'$data$desc) ? substr($desc[1], 0255) : '';
           
$desc preg_replace('#\n#is'' 'strip_tags(rtrim(ltrim($desc)) . '...'));
           
$data preg_replace_callback('#</title>(.*)</head>#ism'
                   function (
$matches) {
                       global 
$desc;
                       return 
"</title>\n<meta name=\"description\" content=\"$desc\">" $matches[1];
                       unset(
$matches);
                   },
           
$data);
           echo 
$data;
           unset(
$desc$data);
        }
        else
        {
            
goHome();
        }
    }
    else
    {
        
goHome();
    }
    
    exit; 
Аватара пользователя
Slash
Администратор
Сообщения: 2028
Поблагодарили: 62 раза

Re: Пакетная обработка HTML файлов

Сообщение Slash » Вс авг 07, 2016 1:02 pm

vihtor писал(а):но под кодировку win-1251

Попробуйте просто сменить кодировку сценария, в файле, например через NotePad++.
vihtor писал(а):Но, он работает на сервере с php 5.4, а у меня даже платный хостинг - 5.3.

Пробежал глазами по коду, на первый взгляд он вполне совместим с 5.4. Можете попробовать.
Аватара пользователя
vihtor
Сообщения: 112
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Пакетная обработка HTML файлов

Сообщение vihtor » Вс авг 07, 2016 1:28 pm

Всё понял. О NotePad++ я знаю, но была проблема с обратной перекодировкой.
Вот только что в Интернете нашёл прекрасную утилитку (REcode), которая перекодирует на компьютере файлы win 1251 в UTF-8 и обратно. Мои действия просты: загрузить файлы с сайта на компьютер - перекодировать в UTF-8 - загрузить на сайт - прописать Скриптом мета-теги - загрузить файлы на компьютер - перекодировать в win 1251 - загрузить на сайт. Всё. Делов -то. А оставлять файлы на сайте в кодировке UTF-8 не получится. Они весят больше. Это мне нужно будет менять тарифный план на хостинге.
Извините за беспокойство.

Отправлено спустя 2 часа 24 минуты 1 секунду:
Ох, и красиво работает скрипт. Я ещё убрал из генерации Описания символ &nbsp; Добавил в массив array('"', '«', '»') как вы рекомендовали выше. А также добавил троеточие в конце Описаний (как вы рекомендовали).

Обнаружил у себя на сайте в некоторых папках ужасные Описания. Т.e. идентичные тайтлы, description и keywords. Что является полной ахинеей. Таких страниц даже в поиске ПС нет.

Т.к. тема называется "Пакетная обработка HTML файлов" , позвольте объяснить свои действия. Может кому понадобится, чтобы не заморачивался. Все действия выполняются на компьютере.
1. Для использования Скрипта, если нужно пакетно перекодировать файлы из win-1251 в UTF-8 используется программа REcode
2. Для пакетной замены строки win-1251 на UTF-8 - программа @Text Replacer
3. Как я писал выше бывают уже прописанные ужасные <meta name="description" content="">. Их сначала нужно удалить, а потом прописать новые Скриптом. Используем пакетно программу notepad++
Далем так: складываем файлы в Папку - открывам Мой компьютер - Диск - Папка с файлами - Правка - Выделить все - (Правой кнопкой мыши в контектном меню) notepad++
Автоматически откроется notepad++ со всеми загруженными файлами. Далее (в меню сверху): Поиск - Замена.
Так как на всех страницах Описания разные, убиваем ужасную строку регулярными выражениями.
В верхнем окне вводим: <meta name="description" content="([^"]*)"> Нижнее окно оставляем пустым. Щёлкаем "Заменить всё во всех открытых документах". Эту строку сдует как ветром во всех файлах.
Ну, а далее загружаем файлы на сервер. Прописываем Описания страниц замечательным, уникальным Скриптом. Спасибо автору.
Всё. РАБОТАЕМ...

Вернуться в «PHP»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость