6

我能找到的有关该shExpMatch功能的所有文档都很糟糕。例如:

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

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

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

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

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

4

1 回答 1

5

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

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);
}

来源

就像你说的,来自 Netscape 的原始文档在这里,现在移到了这里。(来源)。

Afaik 这些 proxy.pac 的一些实现不支持成熟的JScriptJavaScript,但仅支持ECMAScript。我还看到了不使用这些方法而是使用字符串操作的 proxy.pac 文件:

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

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

希望有所帮助;)

于 2016-06-02T08:55:23.083 回答