shExpMatch究竟做了什么样的匹配?

时间:2016-04-01 17:51:25

标签: javascript proxy.pac

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

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

我和很多贝壳一起工作过,我从来没有见过短语" shell表达"用于描述之前的模式匹配语言。我不知道它应该是什么意思。从可用的示例看,它看起来类似于文件名通配模式。我想知道他们为什么不" glob"或"通配符"或"文件名扩展" (如果这是他们的意思,那么这3个中的任何一个都将是更标准,可识别的术语)。取而代之的是未定义的短语" shell表达式"是每个供应商普遍使用的 - 但仅用于描述此功能。如果我没有更好地了解,我认为他们只是在没有阅读的情况下复制彼此的文档。

如果我们接受" shell表达"意味着全球然后问题刚刚开始。 哪个shell?不同的实现是否一致?我可以猜测这个函数是由一些unix程序员发起的,他们默认的globs是Bourne-shell-ish。但是 -ish 后缀有很多变种!基本功能包括*?以及[][]是否支持[[:alnum:]]等字符类,或仅支持单个字符和范围?它是否支持[!a-z][^a-z]之类的否定?可以通过在反斜杠前面加上反斜杠(包括反斜杠本身)来对所有特殊字符进行字面匹配吗?还有其他类似shell的引用操作符吗? *运算符确实是否像glob一样,匹配目录层次结构的单个级别,因此**/*是互斥的,或者它是否匹配斜线呢?它是否与前导点不匹配?是否存在kshbashzsh的任何扩展程序?也许甚至csh - 像大括号扩展(这不是一个全局操作,但经常被误认为是)?

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

是否有一个我忽略的权威来源实际指定了匹配规则?如果做不到这一点,是否有人研究了当前的实施,以确定实际的规则是什么?

1 个答案:

答案 0 :(得分:3)

这是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)。

Afaik这些proxy.pac的一些实现不支持fullblown JScriptJavaScript,但只支持ECMAScript。我也看到了不使用这些方法但却使用字符串操作的proxy.pac文件:

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

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

希望有所帮助;)