如果找到<!-- 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但是这也删除了我需要搜索的注释并创建了一些丑陋的格式。
由于
答案 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个字符。