RegEx用于特定模式,不包括URL

时间:2016-11-03 13:18:29

标签: javascript regex

很长一段时间,但我需要使用一些伪造的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模式与任何以特定字符集开头的匹配不匹配?

2 个答案:

答案 0 :(得分:1)

在可能的//之前,即在冒号之后,你需要一个否定的前瞻。

"foo://bar".match(/(\w+:)(?!\/\/)([^\s\}]*)/); //no dice
"foo:bar".match(/(\w+:)(?!\/\/)([^\s\}]*)/); //dice

当然,这也会阻止任何以//合法开头的属性值,但我认为这是一个值得冒的风险。

答案 1 :(得分:0)

我会使用嵌套在regex-replace的handler-function中的正则表达式:

&#13;
&#13;
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;
&#13;
&#13;

第一个正则表达式{([^}]+)}抓取{}之间的所有实例,其中的函数仅适用于那些匹配,因此任何其他冒号都保持不变。