将文本中的Youtube链接替换为特定的嵌入代码

时间:2011-02-15 18:52:28

标签: php jquery mysql html youtube

这是我的问题。我的表单中有一个textarea,用户可以在其中提交YouTube视频链接。我需要解析文本并用他们的嵌入等价物替换youtube链接。一个例子:

文字中的初始网址:“blah blah http://www.youtube.com/watch?v=PLs5HN7FS0w blah blah” 存储在mysql db之前的最终文本:“blah blah [youtube = http://www.youtube.com/watch?v = PLs5HN7FS0w] blah blah”

知道如何使用 php 为文本框中的每个链接执行此操作?

3 个答案:

答案 0 :(得分:3)

使用正则表达式:

$target = 'blah blah http://www.youtube.com/watch?v=PLs5HN7FS0w blah blah';
$target = preg_replace('/(http:\/\/www\.youtube[^ ]*)/', '[youtube=$1]', $target);

这匹配以http://www.youtube开头并且不包含空格的所有内容,并将其捕获到$ 1。然后用[youtube=$1]替换匹配的部分,其中$ 1是URL

答案 1 :(得分:1)

我会选择一个稍微复杂的regExp,更安全一点,并放弃你并不真正需要的所有额外的YT参数(用户会粘贴它们,你可以打赌):

$url = 'blabla http://www.youtube.com/watch?v=I6CyoYSlL-M&feature=rec-LGOUT-exp_stronger_r2-2r-26-HM aaaa bbb ccc';
echo preg_replace('|http://www\.youtube\.com/watch\?.*\bv=([^&]+)[^\s]*|', '[youtube=http://www.youtube.com/watch?v=$1]', $url);

此BBcode也不应该真的需要这个“http://www.youtube ...”网址的一部分,它总是一样的吗?!

答案 2 :(得分:0)

我有点无聊,想出了一个可笑的笨重,虽然相对简单和功能,jQuery的方法这样做:

$('form').submit(

function() {
    var text = $('#text').val().split(' ');
    for (i = 0; i < text.length; i++) {
        var test = text[i].indexOf('http://www.youtube.com/watch');
        if (test != -1) {
            text[i] = '[youtube=' + text[i] + ']';
        }
    }
    text = text.join(' ').trim();
    $('#text').val(text);
    return false;
});

JS Fiddle demo


已编辑,为该功能添加必要的健全性检查:

$( '形式')。提交(

function() {
    var text = $('#text').val().split(' ');
    for (i = 0; i < text.length; i++) {
        var test = text[i].indexOf('http://www.youtube.com/watch');
        var check = text[i].indexOf('[youtube=');
        if (test != -1 && check == -1) {
            text[i] = '[youtube=' + text[i] + ']';
        }
    }
    text = text.join(' ').trim();
    $('#text').val(text);
    return false;
});

JS Fiddle of sanity-checking demo

基本上,在第一个函数中,可以简单地继续重新提交表单并添加'[youtube ='并附加结束']'。后一种方法使我免除了一些愚蠢。当然我可以检查'test'的indexOf()值是否等于0,所以它位于字符串的开头。如果我再看一遍,我可能会这样做。


已编辑因为,有时,我只是不能留下任何东西......

$('form').submit(

function() {
    var text = $('#text').val().split(' ');
    for (i = 0; i < text.length; i++) {
        var test = text[i].indexOf('http://www.youtube.com/watch');
        if (test === 0) {
            text[i] = '[youtube=' + text[i] + ']';
        }
    }
    text = text.join(' ').trim();
    $('#text').val(text);
    return false;
});

Updated JS Fiddle demo

<小时/> 编辑(再次),因为我不能留下任何东西,因为我想(在评论中)jQuery示例应该在php中可行(或多或少直接)。所以这就是:

$text = $_POST['text']; // from the textarea of name="text"

$text = explode(" ",$text);
for ($i=0; $i < count($text); $i++) {
    if (stripos($text[$i], 'http://www.youtube.com/watch') === 0) {
        $text[$i] = '[youtube=' . $text[$i] . ']';
    }
}
$text = implode(" ",$text);

我不知道在哪里公开,安全地主持php演示,所以我无法演示这一点,但我认为应该工作。虽然使用foreach()可能比for()循环更容易。