如何编写regexp以将location.href中#的所有字母表转换为非字母表。
Eg1:源字符串1:www.example.com #blue?something = x
我是什么 期待:蓝色Eg2:源字符串2:www.example.com #blue& something = x
我是什么 期待:蓝色Eg3:Source String 3:www.example.com#blue
我的期望:蓝色Eg4:源字符串4:www.example.com#?something = x
我的期望:“”Eg5:Source String 5:www.example.com
我的期望:“”
答案 0 :(得分:2)
在任何明智的语言中,它都像/(?<=#)[a-z]+/
可悲的是,JS regexes不支持lookbehind断言,我们沦为这个:
var match = (input.match(/#[a-z]+/) || [""])[0].substr(1);
答案 1 :(得分:0)
这些网址不是......特别有效(?
之后的#
?),但如果是,您可以从网址创建一个位置对象并使用locationObject.hash
来获取#
。作为字符串:
str.match(/#([a-z]+)/i)[1];
答案 2 :(得分:0)
请注意,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] || "";
}
但在我看来,可读性较差。
P.S。
如果您真的只对字母表感兴趣,可以将[^?&]
替换为[A-Za-z]
。但是,通过这种方式,您不会将www.example.com#blue12&something=x
之类的网址与www.example.com#blue_and_green&something=x
匹配。如果有意图,可以更换。否则,保持[^?&]
将匹配所有不是?
或&
的字符,因此它会更通用。