通过http://validator.w3.org/check运行我的网站,收到大量错误消息,指出我的链接应使用&
而不是&
。
所以我更新了我的代码,但却发现$_GET
不喜欢这个。
我的网址是:www.mysite.com/?foo=1&bar=2
我将其更改为:www.mysite.com/?foo=1&bar=2
问题是做print_r($_REQUEST)
会给我这个结果:
Array ( [foo] => 1 [amp;storeid] => 2 )
为什么$_GET
,$_POST
和$_REQUEST
无法识别&
?
更新
这是我生成URL的方法之一:
$url = get_bloginfo('url')."/?foo=".$element['name']."&bar=".$element['id'];
$link = '<a href="'.$url.'" title="'.$element['name'].'">'.$element['name'].'</a>';
答案 0 :(得分:20)
&
是&
的HTML实体参考。网址参数仍由单个&
分隔,但如果您在HTML中提及网址,则需要对其进行编码。对于
<img src="img?width=100&height=100" />
然后,浏览器会请求img?width=100&height=100
。
答案 1 :(得分:4)
您必须在某处进行双重编码,例如您的链接:
www.mysite.com/?foo=1&bar=2
变为:
www.mysite.com/?foo=1&bar=2
然后:
www.mysite.com/?foo=1&amp;bar=2
你读到的是正确的。为了澄清,HTML中的 &
必须编码为&
。当然,URL本身仍然只包含&
; PHP永远不会看到“&
”,因为该编码是为了您的浏览器的利益。
答案 2 :(得分:1)
// Fix for & bug in url
if( $_GET ) foreach( $_GET as $key => $value )
{
if( strpos( $key, 'amp;' ) === 0 )
{
$new_key = str_replace( 'amp;', '', $key );
$_GET[ $new_key ] = $value;
unset( $_GET[ $key ] );
}
}
它不适用于filter_input:(
答案 3 :(得分:0)
在任何情况下,手动编码各种URL部分都不是一个好习惯。你应该这样做:
$query_string = 'foo=' . urlencode($element['name']) . '&bar=' . urlencode($element['id']);
echo '<a href="mycgi?' . htmlspecialchars($query_string) . '">';
我认为这将解决不必要的问题。