请注意,URI 语法是:
scheme ":" hier-part [ "?" query ] [ "#" fragment ]
(有关详细信息,请参阅RFC 3986)
因此,在您的示例#blue?something=x
中是片段,并且没有查询字符串。如果正确形成,则在哪里:
www.example.com?something=x#blue
你有?something
作为查询和#blue
片段。去测试:
var a = document.createElement("a");
a.href = "http://www.example.com#blue?something=x"
console.log(a.hash, a.search);
a.href = "http://www.example.com?something=x#blue"
console.log(a.hash, a.search);
因此,首先您必须检查您发布的 URI 是否是您想要的,因为它们似乎格式不正确。
说,如果例子是正确的,你可以使用类似的东西:
function getFragment(s) {
var v = s.match(/#([^?&]+)/);
return v ? v[1] : "";
}
或者:
function getFragment(s) {
return [].concat(s.match(/#([^?&]+)/))[1] || "";
}
但在我看来,可读性较差。
PS如果你真的只对字母感兴趣,你可以[^?&]
用[A-Za-z]
. 但是,通过这种方式,您将不会匹配 URL,例如 www.example.com#blue12&something=x
两者www.example.com#blue_and_green&something=x
。如果有这个意图,可以更换。否则,keep[^?&]
会匹配所有不是?
or的字符&
,所以会更通用。