这是我的问题。我的表单中有一个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 为文本框中的每个链接执行此操作?
答案 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;
});
已编辑,为该功能添加必要的健全性检查:
$( '形式')。提交(
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;
});
<小时/> 编辑(再次),因为我不能留下任何东西,因为我想(在评论中)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()
循环更容易。