正在发布相同的双字符串

时间:2013-04-24 02:33:54

标签: php

所以,我正在尝试为我的评论区域制作一个“报价”系统。 就像,如果有人引用别人,它应该看起来像:

>quoted text

,引用文字为绿色。 我得到了绿色文字,但我现在的问题是,当帖子被引用时,也会出现未引用的版本,例如:

>quote
quote

我的PHP:

<?php

include 'db.php';
$comment = mysql_query("SELECT * FROM posts");
while($row = mysql_fetch_assoc($comment))
{
$p_id = $row['id'];
$c_name = $row['name'];
$c_email = $row['email'];
$c_sub = $row['sub'];
$c_post = $row['post'];
$c_post = str_ireplace('>', "<span class=\"gtext\"><blockquote>$c_post</blockquote></span>", $c_post);
echo "<span class=\"sub\">$c_sub</span> <span class=\"postname\">$c_name</span> No.$p_id &nbsp; \n";
//echo "[a href=\"index.php?reply=$id\">Reply</a>]";
echo "<blockquote>$c_post</blockquote>";
echo "<hr>";
}
?>

2 个答案:

答案 0 :(得分:1)

您的str_ireplace(...)行会将>字符替换为整个引用文字,但原始文字不会被截断。

一种方法是像这样使用preg_replace(...)

$post = preg_replace('/^>(.*)$/m', '<span class="gtext"><blockquote>\{1}</blockquote></span>', $post);

这将匹配以下文字的> ,并将其替换为标记内包含的文字。

如果没有正则表达式,另一种方法就可以了:

if(0 === strpos('>', $post)) {
    $post = substr($post, 1);
    $post = '<span class="gtext"><blockquote>' . $post . '</blockquote></span>';
}

这将检查位置0处的>字符,将其修剪掉,并将标签包裹在标签中。
这仅适用于整个$post是否为单个qoute的情况 preg_replace(...)方法将正确替换>字符的任何出现(匹配文字直到换行)。
表达式中使用的m修饰符将使其检查每一行而不是整个字符串。

答案 1 :(得分:0)

您的str_ireplace电话会查找“&gt;”并用"<span class=\"gtext\"><blockquote>$c_post</blockquote></span>"替换它,所以你仍然有跟随它的引用。

要解决此问题,您可以在“&gt;”之后查找下一个换行符,将其存储,删除新行之前的内容以及“&gt;”之后,然后使用第二个参数调用str_ireplace调用而不是引用第二个参数中新存储的值。

http://php.net/manual/en/function.str-ireplace.php