javascript - shExpMatch 到底做什么样的匹配呢?

标签 javascript proxy.pac

我能找到的关于 shExpMatch 函数的所有文档都很糟糕。例如:

  • findproxyforurl.com - “将尝试将主机名或 URL 与指定的 shell 表达式相匹配”
  • Microsoft - “如果 str 使用 shell 表达式模式匹配 shexp,则 shExpMatch(str, shexp) 函数返回 true。”
  • Mozilla “目前,模式是 shell 表达式,而不是正则表达式。”

我使用过很多 shell,以前从未见过用于描述模式匹配语言的短语“shell 表达式”。我不知道这是什么意思。从可用示例来看,它看起来类似于文件名通配模式。我想知道为什么他们不“glob”、“通配符”或“文件名扩展”(这 3 个中的任何一个都是更标准、更容易识别的术语)如果那是他们的意思。相反,每个 vendor 都普遍使用未定义的短语“shell 表达式”——但仅用于描述此功能。如果我不了解的话,我会认为他们只是在不阅读的情况下复制彼此的文档。

如果我们接受“shell 表达式”意味着 glob,那么麻烦才刚刚开始。 哪个 shell? 不同的实现是否一致?我可以猜测这个函数是由一些 unix 程序员创造的,他们对 globs 的默认想法是 Bourne-shell-ish。但是 -ish 后缀有很多变体!基本特征是 *?[][] 是否支持 [[:alnum:]] 之类的字符类或仅支持单个字符和范围?它是否支持像 [!a-z][^a-z] 这样的否定?所有的特殊字符都可以通过在它们前面加上反斜杠(包括反斜杠本身)来按字面匹配吗?还有其他类似 shell 的引用运算符吗? * 运算符真的像一个 glob,匹配目录层次结构的单个级别吗,所以 **/* 是互斥的,还是它也匹配斜杠?它是否无法匹配前导点?是否存在来自 kshbashzsh 的任何扩展?甚至可能像 csh 一样的大括号扩展(这不是一个 glob 操作,但经常被误认为是一个操作)?

另一方面,也许它是由面向Microsoft的人设计的,以支持Windows用户,所以我应该更像COMMAND.COM通配符。 Microsoft 会使用一种外国模式匹配语言,而不是明确记录这种语言吗?

是否有我忽略的权威来源实际指定了匹配规则?如果做不到这一点,是否有人足够详细地研究了当前的实现以确定规则的实际内容?

最佳答案

这是 Mozilla 使用的 shExpMatch() 的实现:

function shExpMatch(url, pattern) {
   pattern = pattern.replace(/\./g, '\\.');
   pattern = pattern.replace(/\*/g, '.*');
   pattern = pattern.replace(/\?/g, '.');
   var newRe = new RegExp('^'+pattern+'$');
   return newRe.test(url);
}

( Source )

就像你说的来自 Netscape 的原始文档是 here现在搬到了here . (Source)。

据我所知,这些 proxy.pac 的一些实现不支持完全成熟的 JScriptJavaScript但只有ECMAScript .我还看到了不使用这些方法而是使用字符串操作的 proxy.pac 文件:

function FindProxyForURL(url,host)
{
    if (host.substring(0, 4) == "192." ||
       host.substring(0, 7) == "example" )
    {
        return "DIRECT";
    }
}

所以看起来真的没有默认标准。对于 Windows,我现在使用像 WinHttpGetProxyForUrl 这样的 WinApi 调用.至少我的实现不会与我的操作系统不同。

希望对您有所帮助 ;)

关于javascript - shExpMatch 到底做什么样的匹配呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36362748/

相关文章:

javascript - 如何调试用于 IE 代理设置的 Javascript proxy.pac 文件?

javascript - firestore transaction.set(ref, data, {merge : true}) and transaction. update(ref, data) 之间有什么区别?

javascript - 如何在使用 express 在 nodejs 中进行身份验证后授予对文件夹的访问权限?

javascript - 比较 JavaScript 中的函数与 .toString()

javascript - 使用 Express、Node.JS 和 Require 模块进行外部 API 调用

google-chrome-extension - 在chrome浏览器中自动重新加载proxy.pac文件

javascript - 在 C# (WPF) 中解析 proxy.pac 文件

proxy - CNTLM 代理和 .pac 文件

javascript - 突出显示句子中单击时的单词