很长一段时间,但我需要使用一些伪造的HTML并使用JavaScript将其替换为真实的HTML。例如:
{span class:text-bold data:attribute}TITLE{/span}
需要改为:
<span class="text-bold" data="attribute">TITLE</span>
我使用RegEx来执行此操作,因为我无法预测可以放在每个元素上的每个属性。表达式或多或少地用于查找每个数据实例:attribute:
/(\w+\:)(.[^\s\}]*)/g
但是,有一个问题;此表达式还匹配URL,例如:
http://www.google.ca
在尝试从匹配中排除任何网址时,我更改了表达式,如下所示:
/(?!http)(\w+\:)(.[^\s\}]*)/g
然而,这没有预期的效果,该模式继续匹配网址,只是没有领先的&#39; h。例如,
ttp://www.google.ca
我承认我很久没有使用过RegEx了,所以我可能会误解某些东西。如何判断RegEx模式与任何以特定字符集开头的匹配不匹配?
答案 0 :(得分:1)
在可能的//
之前,即在冒号之后,你需要一个否定的前瞻。
"foo://bar".match(/(\w+:)(?!\/\/)([^\s\}]*)/); //no dice
"foo:bar".match(/(\w+:)(?!\/\/)([^\s\}]*)/); //dice
当然,这也会阻止任何以//
合法开头的属性值,但我认为这是一个值得冒的风险。
答案 1 :(得分:0)
我会使用嵌套在regex-replace的handler-function中的正则表达式:
document.getElementById('outp').value = document.getElementById('inp').value.replace(
/{([^}]+)}/g, function(m, tag) {
return '<' + tag.replace(/(\w+):(\S+)/g, '$1="$2"') + '>';
});
&#13;
textarea {
width:100%;
}
&#13;
<textarea id="inp" rows="5">{span class:text-bold data:attribute}TITLE{/span}
http://www.google.ca</textarea>
<textarea id="outp" rows="5"></textarea>
&#13;
第一个正则表达式{([^}]+)}
抓取{
和}
之间的所有实例,其中的函数仅适用于那些匹配,因此任何其他冒号都保持不变。