RegEx-en本身并不擅长这种事情。
我会做类似的事情:
function validateAnchor(anchor){
var match,
name,
value,
test,
attrRE=/\s([a-z]+)(?:\s*=\s*"([^"]+))?"/gi, // matches one tag attribute
allowedAttrs={ // attributes must appear here to be considered legal
href:{
isValid:function(val){
return isValidURL(val);
}
},
title:{
isValid:function(val){
return true;
}
},
target:{
isValid:function(val){
return true;
}
}
},
result=true;
while(match=attrRE.exec(anchor)){
name=match[1].toLowerCase(); // lowerCase to match our allowedAttrs keys
value=match[2]||''; // optional
// must have a name
if(!name){
console.log('no name for this attr - should not happen!');
result=false;
break;
}
// and must exist in allowedAttrs
if(test=allowedAttrs[name]) {
console.log('unknown attr');
result=false;
break;
}
// if it has a value and there is am isValid function.
if(value && 'function'==typeof(attr.isValid)){
if(!attr.isValid(value)){ // which fails!
result=false;
break;
}
}
}
return result;
}
因此,鉴于:
var anchor='<a href=\"...\" target = \"...\" foo >';
validateAnchor(anchor) 将失败,因为 'foo' 是一个不允许的属性(未在 allowedAttrs 中定义)。
这种方法的好处是你
- 每次需要接受新属性时都不需要修改 RE,
- 可以有无价值的属性
我将 isValidURL() 留给您定义。