Замените ссылки на Youtube в тексте специальным кодом для встраивания


Вот в чем моя проблема. У меня есть текстовая область в моей форме, где пользователи могут отправлять ссылки на видео YouTube . Мне нужно разобрать текст и заменить ссылку на YouTube их эквивалентами для встраивания. пример:

Начальный URL в тексте: "бла-бла-бла http://www.youtube.com/watch?v=PLs5HN7FS0w бла-бла-бла" Окончательный текст перед сохранением в БД mysql: "бла-бла-бла[youtube=http://www.youtube.com/watch?v=pls5hn7fs0w] бла-бла"

Любая идея, как это сделать для каждой ссылки в текстовом поле с php?

Author: Hirvesh, 2011-02-15

3 answers

Мне стало немного скучно, и я придумал смехотворно неуклюжий, хотя относительно простой и функциональный способ 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.


Отредактировано, чтобы добавить необходимую проверку работоспособности функции:

$("форма").отправить (

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 для проверки здравомыслия.

В принципе, в первой функции можно было просто продолжать повторно отправлять форму и добавлять '[youtube=' и добавление закрывающего "]". Этот последний подход освобождает меня от некоторой части глупости. Конечно, я мог бы просто проверить, что значение indexOf() 'test' равно 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;
});

Обновленная демо-версия JS Fiddle.


Отредактировано (снова) потому что я не могу оставить все как есть, и потому что я понял (в комментариях), что пример 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().

 0
Author: David Thomas, 2011-02-15 21:08:15

Используйте регулярные выражения:

$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-адрес

 3
Author: German Rumm, 2011-02-15 18:58:20

Я бы выбрал немного более сложное регулярное выражение, чтобы быть немного безопаснее и удалить все дополнительные параметры 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 ..."часть URL-адреса, она всегда одна и та же?!

 1
Author: ivanhoe, 2011-02-19 01:01:05