Создать рекламу из текста из базы данных (аналогично «читать дальше») - PullRequest
0 голосов
/ 02 ноября 2009

Я пытаюсь вырезать текст из базы данных, если найден <!-- break -->, тогда показывать только то, что есть до перерыва. В настоящее время у меня есть этот код

        //get the description before the more link
        $project_blurb =  htmlspecialchars_decode($project_data['p_desc']);
        if (strstr($project_blurb, '<!-- break -->')) {
            $project_blurb = explode("<!-- break -->" , $project_blurb);
            $project_desc = $project_blurb[0];
            }
        else{
            $project_desc = $project_blurb;
        }

Это работает, за исключением того, что текст начинается с тега <p>, и в настоящее время я обрезаю его на конечный тег </p>, который нарушает HTML на сайте. Я хочу знать, есть ли лучший способ получить описание только до "перерыва". Я пытался использовать strip_tags, но это также лишает комментарий, который мне нужно искать, и создает некрасивое форматирование.

Спасибо

Ответы [ 3 ]

1 голос
/ 04 ноября 2009

Решение, которое я придумал, похоже на метод jheddings.

Я исправил его скрипт и использовал фрагмент кода, который нашел здесь

Snipplr Закрыть теги во фрагменте HTML

Чтобы найти открытые теги и закрыть их (обратите внимание, что я предполагаю, что вы действительно заботитесь только о закрытии тегов p)

Примечание: фрагмент может иметь недостатки, но ему удалось выполнить работу для примера, с которым я работал

Таким образом, в приведенном ниже примере сценария я беру образец рекламного ролика, вырезая все после маркера разрыва и добавляя к нему «...» Затем мы раздеваем все, кроме тегов p. Затем я использую функцию closetags, чтобы сопоставить все теги и закрыть все несопоставленные.

Это далеко не аккуратно, но если ваш набор данных достаточно прост, это может быть быстрый способ сделать это.

<?php
$project_blurb = "<p>This is a blurb with content</p><p>This is another<!-- break -->blurb</p>"; 

if ($pos = strpos($project_blurb, '<!-- break -->')) {
    $project_desc = substr($project_blurb, 0, $pos)."...";
} else {
    $project_desc = $project_blurb;
}

$project_desc = strip_tags($project_desc, '<p>');
$project_desc = closetags($project_desc);

echo $project_desc;

function closetags ( $html )
{
    #put all opened tags into an array
    preg_match_all ( "#<([a-z]+)( .*)?(?!/)>#iU", $html, $result );
    $openedtags = $result[1];

    #put all closed tags into an array
    preg_match_all ( "#</([a-z]+)>#iU", $html, $result );
    $closedtags = $result[1];
    $len_opened = count ( $openedtags );
    # all tags are closed
    if( count ( $closedtags ) == $len_opened )
    {
        return $html;
    }
    $openedtags = array_reverse ( $openedtags );
    # close tags
    for( $i = 0; $i < $len_opened; $i++ )
    {
        if ( !in_array ( $openedtags[$i], $closedtags ) )
        {
            $html .= "</" . $openedtags[$i] . ">";
        }
        else
        {
            unset ( $closedtags[array_search ( $openedtags[$i], $closedtags)] );
        }
    }
    return $html;
}

?>
1 голос
/ 04 сентября 2010

Вы, ребята, все делаете это неправильно !!

Это исходит из БД, вот как i делает это:

SELECT SUBSTR(description, 1, INSTR(description, '<!-- break -->') -1);

Зачем делать это открыто с языками программирования ???

Демо-версия !!

CREATE TEMPORARY TABLE foo (description text);
INSERT INTO foo VALUES ('This is a really long paragraph. <!-- break --> OK, not really ;-)');
SELECT SUBSTRING(description, 1, INSTR(description, '<!-- break -->') - 1) AS description FROM foo;
// Output: This is a really long paragraph.
0 голосов
/ 02 ноября 2009

Если вам нужно выбрать до вашего перерыва, позвоните теги полосы после того, как вы получите поле. Кроме того, вы можете сделать его немного более эффективным, выполнив поиск перерыва только один раз:

<?
$project_blurb = htmlspecialchars_decode($project_data['p_desc']);
if (($pos = strpos('<!-- break -->'), $project_blurb) >= 0) {
  $project_desc = substr(0, $pos);
} else {
  $project_desc = $project_blurb;
}
$project_desc = strip_tags($project_desc);
?>

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

Если вы собираетесь ссылаться на полный текст со своей страницы, вместо того, чтобы развернуть его на месте, вы также можете подумать о том, чтобы позволить вашей базе данных выполнить часть работы за вас. Предполагая, что вы используете MySQL, вы можете использовать LEFT(p_desc, 200), чтобы извлечь только первые 200 символов базы данных из поля p_desc.

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