Могу ли я (должен) использовать PHP для изменения HTML-страницы перед обслуживанием, основываясь на значениях атрибутов класса - PullRequest
1 голос
/ 26 апреля 2011

Мне бы хотелось, чтобы авторы контента с ограниченным опытом написания кода могли легко указать дату истечения срока действия выбранного контента на существующих страницах HTML (PHP) на нашем сайте.Я бы предпочел удалить контент со стороны сервера, чтобы он по-прежнему не был доступен в исходном коде.

Иллюстрация потенциального решения, над которым я размышляю:

<div class="story"> ... </div> 

Допустим, я бы хотел, чтобы вышеприведенный div и его содержимое исчезли с 1 июня 2011 года. Поэтому я хотел бы добавитьзначение атрибута class:

<div class="story disappears-20110601"> ... </div>

Тогда мне нужно было бы написать некоторый код (xpath?), чтобы найти все элементы, которые имеют значение класса, с шаблоном вроде = "... disapears- YYYYMMDD».Если ссылка на дату действительна, а эта дата - сегодня или раньше, код удалит весь DIV и его содержимое из DOM, а затем будет обслуживать страницу без DIV.

Прежде чем я попытаюсь установитьэто, что вы думаете о концепции?Это возможно?Если это будет реализовано по всему миру, станет ли это ужасным боровом с ресурсами?

Ответы [ 5 ]

0 голосов
/ 26 апреля 2011

Эта XPath 1.0 выберет нужные элементы:

//*[
   20110601
 >= 
   substring-before(
      substring-after(
         concat(
            ' ',
            normalize-space(@class),
            ' '
         ),
         ' disappears-'
      ),
      ' '
   )
]
0 голосов
/ 26 апреля 2011

Я имею в виду, что база данных должна быть доступна.Даже если страницы закодированы вручную, вы можете сделать так, чтобы они загружали каждую страницу на ваш сервер, а фоновый сервер создавал запись базы данных, которая соответствует загруженной странице.эта запись базы данных может хранить информацию о загруженной странице, такую ​​как срок годности.Это также упрощает организацию / обслуживание страницы.

0 голосов
/ 26 апреля 2011

Ну, вы могли бы сделать это, используя Regexp, но я предполагаю, что это / может / (не значит, что это будет) немного запутаться. Я предлагаю использовать базу данных, если у вас есть доступ к ней, если не хранить истории в отдельных файлах (в одном каталоге), а затем загружать / удалять / редактировать их через имя файла.

По моему мнению, делать это через HTML было бы неприятно.

EDIT:

<?php
    $html_content = file_get_contents('...');
    preg_match('/class="story disappears-(\d*)"/i', $html_content, $match_array)
    foreach($match_array as $val) {
        if (intval($val) < intval(date('Ymd'))) {
            $new_html_content = preg_replace('/(<div class="story disappears-'. $val .'">.*<\/div>)/', '',  $html_content);
            echo $new_html_content;
        }
    }
?>

Просто замечание: сначала попробуйте отладить это, возможно, я допустил ошибку, поскольку некоторое время не использовал php. Однако, если вы наткнетесь на какие-либо ошибки, дайте мне знать в комментариях, чтобы я мог обновить код.

0 голосов
/ 26 апреля 2011

Вот код для вас:

<?php

$content = <<<EOF
<div>
some text 1
<div class="story disappears-20110101"> 20110101 </div>
<div class="story disappears-20110601"> 20110601 </div>
some text 2
</div>
EOF;

$doc = new DOMDocument();
$doc->loadHTML($content);
$xpath = new DOMXPath($doc);
$expired = $xpath->query('//*[contains(@class, \'disappears-\')]');
$remove = array();
foreach ($expired as $n)
    if (preg_match('~disappears-(\d{4})(\d{2})(\d{2})~', $n->getAttribute('class'), $m))
        if (time() > mktime(0, 0, 0, $m[2], $m[3], $m[1]))
            $remove[] = $n;
foreach ($remove as $n)
    $n->parentNode->removeChild($n);

echo $doc->saveHTML();

Хорошего дня.

0 голосов
/ 26 апреля 2011

Гораздо лучший способ - сохранить содержимое в таблице базы данных и назначить дату окончания срока действия через поле DATETIME. Для этого используется класс css - маленький квадратный колышек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...