1

如果有人问过这个问题,我很抱歉,但我真的找不到有效的解决方案。我正在开发一个留言板系统,它已经完成并且可以正常工作,但是我需要将其简化,我目前已将其设置为剥离所有会破坏 sql 等但允许强、em、img 和 a 的东西。我的问题是,如果我使用标签它工作正常,但人们有时不知道如何使用它,所以我不必显示解释它的文本,我只想让 php 为我修复它。因此,用户可以剪切和粘贴地址,然后输入文本并在需要时拥有更多地址,然后提交表单。然后显示时,我希望超链接能够工作。现在,如果我使用标签,它可以正常工作,但如果我不使用标签,它只会吐出普通文本。

我到处看了看,没有任何效果。我发生的最多的是帖子根本没有出现。如果有一种不同的语言可以更容易地做到这一点,我愿意使用它,但现在我专注于 PHP 和 MySQL 来完成这项工作。如果需要,我愿意发布代码,但我不想在这篇文章中充斥大量无用的数据。我只需要它来搜索正文数据找到链接将其变成链接然后将其与周围的所有内容一起吐出。

为了清除一些东西,我正在使用包含文件夹中的方法。每个普通页面只有一小部分代码与我需要它做的事情有关。所以 forum.php 真的没有设计,而是拉出一个头文件和页脚文件,其中包含所有设计和静态内容,不会因页面而异。现在 read.php 文件会提取包含文件夹中的所有文件,并在需要时应用它们。所以我使用的代码:

public static function url_to_link($text) {
        // The Regular Expression filter
        $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
        // Check if there is a url in the text
        if (preg_match_all($reg_exUrl, $text, $url)) {
            // make the urls hyper links            
            foreach($url[0] as $v){                
                //current position of the searached url
                $curpos = strpos($text,' '.$v)+1;
                //delete the url                
                $text = substr_replace($text,'', $curpos, strlen($v));
                //insert the link
                $text = substr_replace($text,''.$v.'', $curpos ,0);                
            }
            return $text;
        } 
        else {
            // if no urls in the text just return the text
            return $text;
        }
    }

无论如何,其中之一在文件includes/comment.php 中。那里还有其他函数可以获取 thread_id 并将其传递到 read.php 页面并显示对线程的回复。现在在 read.php 文件中,我有以下代码:

<div id="comments">
<?php foreach($comments as $comment): ?>
<div class="comment" style="margin-bottom: 2em;">
<div class="author">
<a href='profile.php?id=<?php echo $diuser[0] ?> '><?php echo htmlentities($comment->author) ?></a> wrote:
</div>
<div class="body">
<?php echo strip_tags($comment->body, '<strong><em><p><a><img>'); ?>
</div>
<div class="meta-info" style="font-size: 0.8em;">
<?php echo datetime_to_text($comment->posted); ?>
</div>
____________________________
</div>
<?php endforeach;
if(empty($comments)) { echo "No comments."; } ?>
</div>

然后我将其更改为调用我添加的新函数:

<div id="comments">
<?php foreach($comments as $comment): ?>
<div class="comment" style="margin-bottom: 2em;">
<div class="author">
<a href='profile.php?id=<?php echo $diuser[0] ?> '><?php echo htmlentities($comment->author) ?></a> wrote:
</div>
<div class="body">

<?php $comment_body = Comment::url_to_link($comment->body);
     echo nl2br($comment_body); ?>
</div>
<div class="meta-info" style="font-size: 0.8em;">
<?php echo datetime_to_text($comment->posted); ?>
</div>
____________________________
</div>

这会产生如下所示的内容:

user wrote:
Thttp://www.example.com

Testing links.
June 28, 2013 at 03:09 PM
____________________________

数据应显示为

user wrote:
Testing

http://www.example.com

Testing Links.
Date (you get the idea)

所以代码在做某事,但它并没有将数据更改为链接,它只是删除了一些数据,然后将它们拼接在一起。我知道我做错了什么,但我无法弄清楚。

是的,我使用了 htmlentities 和 mysql_real_escape_string。请帮我。

- 编辑 -

tl;dr = 用户在论坛中输入以下内容:

testing http://stackoverflow.com  testing links

我希望链接在输出上起作用,但我只希望实际链接显示为链接;它应该看起来像这样

testing <a href="http://stackoverflow.com">http://stackoverflow.com</a> testing links

但是我发现的代码不起作用。我是否必须为链接添加输入才能使其正常工作,我可以这样做,但我更希望用户只需在正文输入中输入 url,然后代码会将其转换为输出的实际链接。我目前拥有的代码在上面,再次不起作用。

4

2 回答 2

0

您不需要查看 MySQL。数据库很好。

您需要查看的是正则表达式和其他文本解析功能,以在评论中搜索链接,然后将其输出并用标签包围:

这相当简单。然而,这并不是微不足道的,它的实际结果是大多数网站只是使用 BBCode 或发明一种简单的语法(StackOverflow 和 Reddit 都使用括号包围链接的组合(尽管 StackOverflow 也检测链接))。

preg_replace可能做你正在寻找的东西。

请重新编写您的长篇文章以将其浓缩为包含:

  • 您正在处理的实际文本
  • 预期的输出(带有 HTML 字符)

删除对数据库的任何引用。您已经从数据库中获取了数据,信息的来源现在无关紧要。

于 2013-06-28T20:58:56.153 回答
0

我只是想更新它,以便其他人知道如何让它工作,因为我之前没有得到任何真正的帮助。

首先,我使用 PHP OO 方法。

例子:

Comment.php  // has the makeLinks code

public static function makeLinks($str) {    
     return preg_replace('/(https?):\/\/([A-Za-z0-9\._\-\/\?=&;%,]+)/i', '<a href="$1://$2" target="_blank">$1://$2</a>', $str);
}

该函数将在需要 makeLinks 命令的其他文件中调用,如下所示:

$comment_body = Comment::makeLinks(strip_tags($comment->body, '<strong><em><p><a><img>'));
     echo nl2br($comment_body);

我希望这是有道理的,并且有人会发现它有用。

于 2013-08-20T05:55:08.213 回答