格式化内容并显示媒体

时间:2018-08-16 12:44:04

标签: javascript php html mysql sql

我有一个文本区域,可以在其中输入内容:

<textarea name="content" placeholder="Content"></textarea>

数据库中内容列的类型为Text

所以我可以在此处添加文本,然后将该文本插入数据库:

$stmt = $conn->prepare('INSERT INTO content VALUES(?)');
$stmt->execute( [$content] );

然后,我在网站上的某些位置显示该内容:

$stmt = $conn->prepare('SELECT content FROM posts');
$stmt->execute();
$results = $stmt->fetchAll();

foreach( $results as $result ){
    echo '<div>'. $result .'</div>';
}

但是该内容随后显示为纯文本,所以如果我输入:

$content = "This content contains a URL http://example.com";

我得到:This content contains a URL http://example.com,因此该链接未显示为链接,而是纯文本。

如果我添加了图片,

$content = "http://example.com/images/img.jpg";

或视频:

$content = "http://example.com/images/video.mp4";

或来自YouTube的视频。

那我该怎么办?

我应该使用PHP还是Javascript检查内容是否包含URL /图像/视频,然后将相关的html元素添加到该URL?

1 个答案:

答案 0 :(得分:2)

我不建议使用CKEditor之类的编辑器只是将某些URL包装在标记中,就像其他人令人震惊地建议的那样。这是解决一个简单任务的一种非常懒惰和昂贵的方法(不一定是价格,而是文件的大小和请求的数量)。

以下解决方案未经测试,并且正则表达式模式是从外部来源获取的,因此很遗憾,我无法保证其正确性。自己尝试一下,然后测试,测试,测试。

示例

// your string

$content = "This is the content https://example.com/images/image1.jpg";

// find all URLs in $content and add matches to $matches array

$regex = "#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#";
preg_match_all($regex, $content, $matches);

// loop through $matches array

foreach ($matches as $match) {

    // check each item in array and use regex to determine type

    if (preg_match('/\.(jpg|jpeg|png|gif)(?:[\?\#].*)?$/i', $match)) {
        $markup = '<img src="'.$match.'">';
    } else {
        $markup = '<a href="'.$match.'">'.$match.'</a>';
    }

    // now replace the $match'ed URL in $content with the right $markup

    str_replace($match, $markup, $content);

}

DOCS

preg_match_allhttp://php.net/manual/en/function.preg-match-all.php

preg_matchhttp://php.net/manual/en/function.preg-match.php

str_replacehttp://php.net/manual/en/function.str-replace.php