我能找到的关于shExpMatch
函数的所有文档都很糟糕。例如:
我和很多贝壳一起工作过,我从来没有见过短语" shell表达"用于描述之前的模式匹配语言。我不知道它应该是什么意思。从可用的示例看,它看起来类似于文件名通配模式。我想知道他们为什么不说" glob"或"通配符"或"文件名扩展" (如果这是他们的意思,那么这3个中的任何一个都将是更标准,可识别的术语)。取而代之的是未定义的短语" shell表达式"是每个供应商普遍使用的 - 但仅用于描述此功能。如果我没有更好地了解,我认为他们只是在没有阅读的情况下复制彼此的文档。
如果我们接受" shell表达"意味着全球然后问题刚刚开始。 哪个shell?不同的实现是否一致?我可以猜测这个函数是由一些unix程序员发起的,他们默认的globs是Bourne-shell-ish。但是 -ish 后缀有很多变种!基本功能包括*
和?
以及[]
。 []
是否支持[[:alnum:]]
等字符类,或仅支持单个字符和范围?它是否支持[!a-z]
或[^a-z]
之类的否定?可以通过在反斜杠前面加上反斜杠(包括反斜杠本身)来对所有特殊字符进行字面匹配吗?还有其他类似shell的引用操作符吗? *
运算符确实是否像glob一样,匹配目录层次结构的单个级别,因此*
和*/*
是互斥的,或者它是否匹配斜线呢?它是否与前导点不匹配?是否存在ksh
,bash
和zsh
的任何扩展程序?也许甚至csh
- 像大括号扩展(这不是一个全局操作,但经常被误认为是)?
另一方面,也许它是由面向Microsoft的人设计的,以支持Windows用户,因此我应该更像COMMAND.COM通配符。 Microsoft会使用外部模式匹配语言,而不是明确地将其记录下来吗?
是否有一个我忽略的权威来源实际指定了匹配规则?如果做不到这一点,是否有人研究了当前的实施,以确定实际的规则是什么?
答案 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 JScript或JavaScript,但只支持ECMAScript。我也看到了不使用这些方法但却使用字符串操作的proxy.pac文件:
function FindProxyForURL(url,host)
{
if (host.substring(0, 4) == "192." ||
host.substring(0, 7) == "example" )
{
return "DIRECT";
}
}
所以看起来似乎没有默认标准。对于Windows,我现在使用像WinHttpGetProxyForUrl
这样的WinApi调用。至少我的实现与我的操作系统不同。
希望有所帮助;)