Замените ссылки на Youtube в тексте специальным кодом для встраивания
Вот в чем моя проблема. У меня есть текстовая область в моей форме, где пользователи могут отправлять ссылки на видео YouTube . Мне нужно разобрать текст и заменить ссылку на YouTube их эквивалентами для встраивания. пример:
Начальный URL в тексте: "бла-бла-бла http://www.youtube.com/watch?v=PLs5HN7FS0w бла-бла-бла" Окончательный текст перед сохранением в БД mysql: "бла-бла-бла[youtube=http://www.youtube.com/watch?v=pls5hn7fs0w] бла-бла"
Любая идея, как это сделать для каждой ссылки в текстовом поле с php?
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;
});
Отредактировано, чтобы добавить необходимую проверку работоспособности функции:
$("форма").отправить (
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()
.
Используйте регулярные выражения:
$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-адрес
Я бы выбрал немного более сложное регулярное выражение, чтобы быть немного безопаснее и удалить все дополнительные параметры 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-адреса, она всегда одна и та же?!