优化正则表达式匹配域名在url

Optimising regex for matching domain name in url

本文关键字:url 域名 正则表达式 优化      更新时间:2023-09-26

我有一个匹配iframe url的正则表达式,并捕获各种组件。正则表达式在

下面给出
/(<iframe.*?src=['|"])((?:https?:'/'/|'/'/)[^'/]*)(?:.*?)(['|"][^>]*some-token:)([a-zA-Z0-9]+)(.*?>)/igm

要清楚,我的实际要求是在html字符串中转换,如字符串

<iframe src="http://somehost.com/somepath1/path2" class="some-token:abc123">

<iframe src="http://somehost.com/newpath?token=abc123" class="some-token:abc123">

正则表达式的工作原理,因为它应该是,但对于正常长度的html,它需要大约2秒来执行,我认为是非常,高。

如果有人能告诉我如何优化这个正则表达式,我真的很感激,我确信我做了一些可怕的错误,因为在我使用这个正则表达式

之前
/(<iframe.*?src=['|"])(?:.*?)(['|"][^>]*some-token:)([a-zA-Z0-9]+)(.*?>)/igm

完全取代源url,只添加参数,这只需要100毫秒

您不需要(也不应该)将iframe元素解析为字符串;您只需要访问它的属性,并从中检索信息并重写它们。

function fix_iframe_src(iframe) {
    var src = iframe.getAttribute('src');
    var klass = iframe.getAttribute('class');
    var token = get_token(klass);
    src = fix_src(src, token);
    iframe.setAttribute('src', src);
}

写下get_tokenfix_src作为练习。

如果你想找到一堆iframe并将它们全部修复,那么

var iframes = document.querySelectorAll('iframe');
for (var i = 0; i < iframes.length; i++) {
  fix_iframe_src(iframes[i]);
}

顺便说一下,您的class属性的值似乎被破坏了。我怀疑它是否会匹配任何CSS规则,如果这是意图的话。除了提供令牌之外,您是否将其用于其他用途?在这种情况下,最好使用像data-token这样的数据属性。

关于regexp标志的小点:gm标志对你没有任何作用。m是关于将^$等锚匹配到源字符串中行的开始和结束,这对您来说不是问题。g是关于多次匹配的,这也不是问题。

您的regexp花费这么长时间的原因很可能是您将整个DOM扔给它。很难判断,除非你给我们看你调用它的代码