您好 我有一个代码可以显示youtube视频,如果文本中有任何指向youtube的链接
例如具有多个链接
的文字http://www.youtube.com/watch?v=-LiPMxFBLZY 测试 http://www.youtube.com/watch?v=Q3-l22b_Qg8&feature=related
示例: - pradyut.dyndns.org
这个问题有三个部分可以使用正则表达式完成..
1> 逐个获取网址以查看
2>检查他们是否是你的网址
3>将网址转换为youtube对象或iframe ...
第二个和第三个几乎完成了正则表达式..欢迎任何改进...
使用正则表达式完成代码的第一部分繁琐......
这篇文章我转发到函数......
function to_youtubelink(text)
{
if ( text.indexOf ('<') > 0 || text.indexOf ('"') > 0 || text.indexOf ('>') > 0 )
return text;
else
{
var obj_text = new Array();
var oi = 0;
while(text.indexOf('http://') >=0)
{ //getting the paths
var si = text.indexOf('http://');
var gr = text.indexOf('\n', si);
var sp = text.indexOf(' ', si);
var ei;
if ( gr > 0 || sp > 0 )
{
if ( gr >0 && sp > 0 )
{
if ( gr < sp )
{
ei = gr ;
}
else
{
ei = sp ;
}
}
else if ( gr > 0)
{
ei = gr;
}
else
{
ei = sp;
}
}
else
{
ei = text.length;
}
var it = text.substring(si,ei);
if ( it.indexOf('"') > 0)
{
it.substring(0, it.indexOf('"') );
}
if(ei < 0)
ei = text.length;
else
ei = text.indexOf(' ', si) ;
obj_text[oi] = it;
text = text.replace( it, '[link_service]');
oi++;
}
var ob_text = new Array();
var ob =0;
for (oi=0; oi<obj_text.length; oi++)
{
if ( is_youtubelink( obj_text[oi] ) )
{
ob_text[ob] = to_utubelink(obj_text[oi]);
ob++;
}
}
oi = 0;
while ( text.indexOf('[link_service]') >=0 )
{
text = text.replace( '[link_service]', obj_text[oi]);
oi ++;
}
for (ob=0; ob<ob_text.length; ob++)
{
text = text +"\n\n" + ob_text[ob];
}
return text;
}
}
function is_youtubelink(text)
{
var matches = text.match(/http:\/\/(?:www\.)?youtube.*watch\?v=([a-zA-Z0-9\-_]+)/);
if (matches) {
return true;
} else {
return false;
}
}
function to_utubelink(text)
{
var video_id = text.split('v=')[1];
var ampersandPosition = video_id.indexOf('&');
if(ampersandPosition != -1)
{
video_id = video_id.substring(0, ampersandPosition);
}
text = "<iframe title=\"YouTube video player\" class=\"youtube-player\" type=\"text/html\" width=\"425\" height=\"350\" src=\"http://www.youtube.com/embed/" + video_id + "\" frameborder=\"0\"></iframe>"
return text;
}
现在我正确地得到了输出......
但我在想是否可以使用正则表达式更好地简化代码
...特别是让网址部分......
感谢
答案 0 :(得分:1)
尝试这样的事情:
/**
* Extracts a youtube id from a string
*
* @param string
*
* @return mixed
*/
function youtubeIDextract(text) {
var replace = "$1";
if (!text.match(/http:\/\/www\.youtube[^"]+/))
return false;
if (text.match(/^[^v]+v.([^&^=^\/]{11}).*/))
return text.replace(/^[^v]+v.([^&^=^\/]{11}).*/,replace);
else if (text.match(/^[^v]+\?v=([^&^=^\/]{11}).*/))
return text.replace(/^[^v]+\?v=([^&^=^\/]{11}).*/,replace);
else
return false;
}
这里可以看到一个工作示例:http://jsfiddle.net/6PRVp/2/
如果您只想检查某处是否有youtube链接,请执行以下操作:
if (youtubeIDextract(text)) {...}
请注意,这还会检查视频ID中是否有11个字符(如果没有,则会出现格式错误的YouTube链接)。
答案 1 :(得分:0)
试试这个:
function to_youtubelink(a) {
if (a.indexOf("<") > 0 || a.indexOf('"') > 0 || a.indexOf(">") > 0) return a;
var b = Array(),
c = 0;
while (a.indexOf("http://") >= 0) {
var g, d = a.indexOf("http://"),
e = a.indexOf("\n", d),
f = a.indexOf(" ", d);
g = e > 0 || f > 0 ? e > 0 && f > 0 ? f > e ? e : f : e > 0 ? e : f : a.length;
var h = a.substring(d, g);
h.indexOf('"') > 0 && h.substring(0, h.indexOf('"')), g = 0 > g ? a.length : a.indexOf(" ", d), b[c] = h, a = a.replace(h, "[link_service]"), c++
}
var i = Array(),
j = 0;
for (c = 0; b.length > c; c++) is_youtubelink(b[c]) && (i[j] = to_utubelink(b[c]), j++);
c = 0;
while (a.indexOf("[link_service]") >= 0) a = a.replace("[link_service]", b[c]), c++;
for (j = 0; i.length > j; j++) a = a + "\n\n" + i[j];
return a
}
function is_youtubelink(a) {
var b = a.match(/http:\/\/(?:www\.)?youtube.*watch\?v=([a-zA-Z0-9\-_]+)/);
return b ? !0 : !1
}
function to_utubelink(a) {
var b = a.split("v=")[1],
c = b.indexOf("&");
return c != -1 && (b = b.substring(0, c)), a = '<iframe title="YouTube video player" class="youtube-player" type="text/html" width="425" height="350" src="http://www.youtube.com/embed/' + b + '" frameborder="0"></iframe>'
}