我想创建一个函数来获取包含脚本标记的html代码(作为字符串)的字符串 - 例如:“<div>dkjdg</div><script>blabla</script>fgfgh<span>hey</span>
”并返回脚本标记内的所有脚本,包括打开和关闭标签
到目前为止我试过这个:
var s;
function(string)
{
var a = string.toLowerCase().match("/(.*?)<script>(.*?)<//script>(.*?)/");
s = a[2];
return a[1]+a[3];
}
s
包含脚本标记之间的内容,返回是其他所有内容。
但它不起作用......
答案 0 :(得分:2)
如果块看起来像这样会发生什么?
<script type="text/javascript"><![CDATA[
alert('hello </script>');
]]></script>
永远不要使用正则表达式解析HTML。相反,你可以做这样的事情(在jQuery的帮助下):
function GetScript(str) {
var div = $('<div>'), tmpdiv = $('<div>'), scr, ret = '<script';
div[0].innerHTML = str;
scr = div.find('script');
for ( var i = 0; i < scr[0].attributes.length; i++ ) {
var attr = scr[0].attributes[i];
if ( attr.value && attr.value != '' )
ret += ' ' + attr.name + '="' +
tmpdiv.text(attr.value).html().replace(/"/g, '"') +
'"';
}
return ret + '>' + scr.text() + '</script>';
}
这将完全符合您的要求,除非输入完全搞砸并且或多或少100%跨浏览器兼容,否则不会中断。请注意,我们不想使用jQuery的.html()来设置div内容,因为这将eval()块!
此:
GetScript("<div>dkjdg</div><script type='yadda\"yadda'>blabla</script>fgfgh<span>hey</span>")
将返回
'<script type="yadda"yadda">blabla</script>'
答案 1 :(得分:1)
你需要
a)给函数一个名字
b)在脚本标签中转义斜杠
c)逃避正则表达式中的斜线
d)从正则表达式中删除引号
e)将标签包括在支架中
f)不使用正则表达式来解析其他地方提到的html
这个更好DEMO
var str = "<div>dkjdg</div><script>blabla<\/script>fgfgh<span>hey</span>"
var s;
function parseIt(string)
{
var a = string.toLowerCase().match(/(.*?)(<script>.*?<\/script>)(.*)/);
s = a[2];
return a[1]+a[3];
}
var rest = parseIt(str);
document.write("s:<xm"+"p>"+s+"</xmp><hr/>")
document.write("rest:<xm"+"p>"+rest+"</xmp><hr/>")
答案 2 :(得分:0)
至少你正在寻找<//script>
,因为你写错了。
答案 3 :(得分:0)
因为你想拥有一个包含它及其子元素的标签。你应该有一个类似的代码。
var s = "<div>dkjdg</div><script>blabla</script>fgfgh<span>hey</span>";
function getTagContent(string,tag)
{
var regex = new RegExp("<"+tag+">"+"(.*)"+"<\/"+tag+">");
return string.match(regex)[0];
}
alert(getTagContent(s,"script"));