我有一个文本区域,可以在其中输入内容:
<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?
答案 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_all
:http://php.net/manual/en/function.preg-match-all.php
preg_match
:http://php.net/manual/en/function.preg-match.php
str_replace
:http://php.net/manual/en/function.str-replace.php