所以,我正在尝试为我的评论区域制作一个“报价”系统。 就像,如果有人引用别人,它应该看起来像:
>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 \n";
//echo "[a href=\"index.php?reply=$id\">Reply</a>]";
echo "<blockquote>$c_post</blockquote>";
echo "<hr>";
}
?>
答案 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调用而不是引用第二个参数中新存储的值。