0

So, I am trying to make a "quote" system for my comment area. Like, if someone were to quote someone else, it SHOULD appear like:

>quoted text

and the quote text would be green. I got the green text to work, but my issue now is that when the post is quoted, the un-quoted version also appears, like:

>quote
quote

My 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>";
}
?>
4

2 回答 2

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修饰符将使其检查每一行而不是整个字符串。

于 2013-04-24T02:45:24.373 回答
0

您的 str_ireplace 调用会查找 '>' 并将其替换为"<span class=\"gtext\"><blockquote>$c_post</blockquote></span>",因此您仍然有引号。

为了纠正这个问题,您可以在“>”之后查找下一个换行符,存储它,删除新行之前和“>”之后的内容,然后使用第二个参数调用 str_ireplace 调用,而不是引用新存储的值第二个论点。

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

于 2013-04-24T02:46:21.380 回答