如果URL在片段部分中有异常字符(即在#之后),它们应该如何(百分比)转义?我无法在浏览器如何处理这个问题时找到一致的答案,这可能是没有它们的好理由,但我想知道"正确"的答案是什么.
我的测试似乎建议不要逃避,但这只有在跟踪链接时才可靠,而不是粘贴到浏览器的地址栏时.
我写了一个附加的小网页.然后我将以下链接粘贴到各种浏览器中.页面中的"go"链接用于查看单击链接时发生的情况,而不是粘贴链接(在某些浏览器中似乎有所不同)
http://www.frankieandshadow.com/test.html/?new=1# {#&}%7B%23%20%26%7D
(我注意到stackoverlow的URL模式匹配不喜欢 - 我打算整行;再次在那里可能有我的线索!)
Chrome似乎不会出现任何类型的错误,并且始终如一地产生:
#{#&}%7B%23%20%26%7D
Firefox替换了一些(但不是全部)使用非转义等价物粘贴的转义字符,然后生成
#{#&} {#&}
如果你按照链接这是一样的
Safari(在PC上)则相反:它在粘贴上编码非编码的异常字符,然后生成
#%7B%23%20&%7D%7B%23%20%26%7D
但是跟随链接是不同的,生产
#{#&}%7B%23%20%26%7D
令人惊讶的是,IE9的行为就像Chrome一样
IE7在粘贴时用%20替换真实空间,否则单独留下URL并生成
#{#%20&}%7B%23%20%26%7D
如果你点击链接,它会给出
#{#&}%7B%23%20%26%7D
<html>
<head>
<title>test</title>
<script type="text/javascript">
function wibble() {
document.getElementById("wobble").innerHTML =
location.hash.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");
}
</script>
</head>
<body onload='wibble()'>
<div id='wobble'></div>
<a href='/test.html?new=1#{# &}%7B%23%20%26%7D'>go</a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 有没有办法(除了做两个单独的模式匹配)在PHP中使用preg_match来测试字符串的开头或模式?更具体地说,我经常发现自己想要测试我有一个匹配的模式,其前面没有东西,如
preg_match('/[^x]y/', $test)
(也就是说,如果它前面没有x,则匹配y),但如果它出现在$ test的开头(当它也不在x之前,但前面没有任何字符,那么也匹配y,所以[^ x]构造不起作用,因为它总是需要一个字符来匹配它.
在字符串的末尾有一个类似的问题,以确定是否发生了一个没有其他模式的模式.