从数据库中的文本创建一个模糊(类似于“阅读更多”)

时间:2009-11-01 21:26:43

标签: php zend-filter-strip-tags

如果找到<!-- 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 个答案:

答案 0 :(得分:1)

我提出的解决方案类似于jheddings方法。

我更正了他的脚本并使用了我在此处找到的代码段

Snipplr Close Tags In A HTML Snippet

找到打开的标签并关闭它们(注意我假设你真的只关心关闭p标签)

  

注意:该代码段可能有缺点,但它设法完成了我正在使用的示例的工作

因此,在下面的示例脚本中,我将使用示例blurb在break标记之后删除所有内容并将“...”附加到其中。然后我们strip_tag除了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 :(得分:1)

你们这些人都做错了!!

这是来自DB,所以这就是的方式:

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.

答案 2 :(得分:0)

如果您需要选择休息时间,请在获得字段后调用条带标记。此外,只需搜索一次休息时间,您就可以提高效率:

<?
$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)从p_desc字段中仅提取数据库的前200个字符。