首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >htmlspecialchars和ampersand的形式?

htmlspecialchars和ampersand的形式?
EN

Stack Overflow用户
提问于 2013-10-21 11:42:59
回答 2查看 2.4K关注 0票数 0

我有一个小的静态功能,以便我可以轻松地在我的本地网站上建立html有效的网址,它在下面;

代码语言:javascript
复制
public static function url($path = false) {

    // Build return url with special html characters escaped
    return 'http://127.0.0.1/' . htmlspecialchars($path);
}

我有两个urls,一个在锚内,另一个在表单动作中,它们在下面;

代码语言:javascript
复制
Root::url('test?category=' . $category . '&index=' . $index) // Href

Root::url('test?category=' . $_GET['category'] . '&index=' . $_GET['index']) // Form

GET === $,您可以在我的静态函数中看到,我使用htmlspecialchars从url中转义特殊的html字符。

锚一个返回一个有效的链接,并按预期工作。但是,表单1返回以下内容,如单击表单提交时,浏览器中的url如下所示。

代码语言:javascript
复制
http://127.0.0.1/test?category=innate&index=0

为什么会这样呢?我的网站崩溃是因为它依赖于GET参数是有效的。

谢谢你的时间,希望这是有意义的。

编辑

我将函数调用的返回值直接插入到表单操作中,

代码语言:javascript
复制
<form 
action="<?= Root::url('test?category=' . $_GET['category'] . '&index=' . $_GET['index']); ?>" 
method="post">

编辑

表格html如下;

代码语言:javascript
复制
<form action="http://example.com/test?category=innate&amp;index=0" method="post">

锚html如下所示

代码语言:javascript
复制
<a href="http://example.com/test?category=innate&amp;index=0">

这是否与发送POST请求的服务器有关,即使我获得了参数?

编辑#3

好的,这与我的函数或传递的内容有关,我在表单submit中硬输入url,没有问题,这意味着它只能是我的函数返回的内容。

我自己看不出我是什么样子!

答案

表单提交后,我将使用header重定向到同一个页面,以防止表单重新提交。头的字符串是由Root::url()生成的。

我花了两个小时才弄明白,但是男孩,感觉很好!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-21 12:17:04

通常,您不会向POST URL添加查询字符串。这并不是禁止的,但它可能只是有点混乱,特别是如果您使用$_REQUEST (似乎您不使用)。

我不知道为什么您的浏览器显示一个未解释的&amp;,它应该解释它。

你的问题很可能是由于以下其中之一:

  1. 一个糟糕的浏览器-尝试另一个
  2. 表单输入字段的不良内容
  3. 其他
票数 1
EN

Stack Overflow用户

发布于 2013-10-21 12:52:21

这是相当合乎逻辑的。

我假设您的url()方法如下所示:

代码语言:javascript
复制
url($string){
  echo htmlspecialchars($string);
}

让我们看看您正在传递的$string

代码语言:javascript
复制
'test?category=' . $_GET['category'] . '&index=' . $_GET['index'];

正如我在输出中看到的,替换这些值时,发生htmlspecialchars()之前的最后一个字符串是:

'test?category=innate&index=0'及其之后:test?category=innate&amp;index=0

这里发生何事?您首先将字符串连接起来,然后htmlspecialchars()对用于分隔参数的&进行了编辑,并且为了不破坏url,您不希望将转换为 '&‘。

另外,为了净化url,您不应该使用htmlspecialchars(),因为大多数html实体都会转换为& + somename + ;,例如,欧元符号将转换为&euro;,并且您不希望url中有实际的&符号,浏览器将解释它,因为您正在等待另一个新的参数。

您应该使用urlencode(),这将将您的&转换为:%26,而且,函数的名称是不言自明的,它正在编码一个字符串以便在URL上使用。

但是,您希望&分隔参数,但不希望在$GET值中。我们该怎么办?若要在连接字符串之前对值进行urlencode,请执行以下操作。我建议一种类似这样的方法:

代码语言:javascript
复制
function url($page, $get){
    $parameters = array();
    foreach($get as $k => $v) $parameters[] = urlencode($k)."=".urlencode($v);
    //We are concatenating with ? and & the urlencoded() values in the next line:
    echo urlencode($page).'?'.implode('&', $parameters);
}

url('test', $_GET); // outputs: test?category=innate&index=0 

这将消除表单的字段名和值中的特殊字符。

我注意到您将使用两个固定的参数,类别和索引,因此该方法可以如下所示:

代码语言:javascript
复制
function url($page, $get){
    $page = urlencode($page);
    $category = urlencode($get['category']);
    $index = urlencode($get['index']);
    echo "$page?category=$category&index=$index";
}

希望这是你所需要的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19493606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档