我想解析文本中嵌入对象的多个youtube链接。
例如,在文本中:
This is a test another testing I'm writing this...
http://www.youtube.com/watch?v=-LiPMxFBLZY This is a test another testing I'm writing this...
http://www.youtube.com/watch?v=Q3-l22b_Qg8&feature=related another test
现在,链接将转换为iframe,结果文本为:
This is a test another testing I'm writing this...
<iframe title="YouTube video player" class="youtube-player" type="text/html" width="425" height="350" src="http://www.youtube.com/embed/-LiPMxFBLZY" frameborder="0"> </iframe> This is a test another testing i m writing this...
<iframe title="YouTube video player" class="youtube-player" type="text/html" width="425" height="350" src="http://www.youtube.com/embed/Q3-l22b_Qg8" frameborder="0"></iframe> another test
然后必须使用此代码发送文本以链接任何其他链接...
function text_to_link(inputText) {
var object_text = new Array();
var oi = 0;
while (inputText.indexOf('<object') >= 0) {
var si = inputText.indexOf('<object');
var ei = inputText.indexOf('</object>');
object_text[oi] = inputText.substring(si, ei + 9);
inputText = inputText.replace(object_text[oi], '[ob_service]');
oi++;
}
var iframe_text = new Array();
var ii = 0;
while (inputText.indexOf('<iframe') >= 0) {
var si = inputText.indexOf('<iframe');
var ei = inputText.indexOf('</iframe>');
iframe_text[ii] = inputText.substring(si, ei + 9);
inputText = inputText.replace(iframe_text[ii], '[if_service]');
ii++;
}
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
inputText = inputText.replace(exp, "<a href='$1' target='_blank'>$1</a>");
oi = 0;
while (inputText.indexOf('[ob_service]') >= 0) {
inputText = inputText.replace('[ob_service]', object_text[oi]);
oi++;
}
ii = 0;
while (inputText.indexOf('[if_service]') >= 0) {
inputText = inputText.replace('[if_service]', iframe_text[ii]);
ii++;
}
return inputText;
}
请帮我找一个更简单的正则表达式解决方案......
答案 0 :(得分:0)
基本上,您希望匹配以“http,https,文件或文件”开头的链接。 但您不希望匹配可能出现在iframe或对象标记内的链接,也不希望匹配这两个先前标记的属性。
不幸的是,您已达到Javascript正则表达式的限制。 要解决您的问题,您需要一个好的HTML解析器。
顺便说一句,你可以重构你的代码。链接替换之前和之后的循环可以放在函数中。