php rawurldecode不会产生传递给rawurlencode的相同字符串

时间:2012-08-27 22:09:06

标签: php codeigniter

我需要能够在我网站的URL的URI段中包含空格和括号(该段用于数据库查询)。所以,我rawurlencode()一个字符串,然后rawurldecode()接收页面中的相同字符串,但它并不完全相同。空格很好,但括号保留在十六进制字符代码中。这完全搞砸了我的数据库查询。知道为什么rawurldecode没有产生传递给rawurlencode()的精确字符串?

原始字符串=康普顿社区学院(CA)

编码的字符串=

  Compton%20Community%20College%20%28CA%29

解码后的字符串的vardump是

  string(38) "Compton Community College (CA)"

在视图页面源

  "Compton Community College (CA)"

修改

好吧,显然这可能是一个Codeigniter的东西(我正在使用)。代码

<a href='<?php echo site_url('college/'.rawurlencode($player['college'])); ?>'> 

生成http://localhost/ff/index.php/college/Compton%20Community%20College%20%28CA%29

的正确网址

最终的URI段将作为以下函数中的参数

收到
function view_college($college = FALSE)
{
    if($college === FALSE)
    {//no college provided
        redirect('');
    }
    $college = rawurldecode($college);

此时字符串已经显示在上面显示的格式中。所以也许我搞砸了一些东西,或者只是不能指望CI正确传递字符串。 :-(想法?

3 个答案:

答案 0 :(得分:1)

如果您不想使用ID(可能出于SEO原因),您可以在db - web url中添加另一个字段,并编写大学名称的Web安全版本...在您的示例中它可以类似于 Compton-Community-College-CA 甚至小写。

完整网址:

http://localhost/ff/index.php/college/Compton-Community-College-CA

CodeIgniter's URL Helper有一个很好的功能: url_title()

答案 1 :(得分:0)

否否否。不要那样做。太可怕了!

将所有大学放入数据库并使用自动递增整数id列深入研究其内容:

如果您在<base>中放置了一个HTML <head>元素来定义根目录:

<base href="http://localhost/yourapp/">

然后你可以写得非常简单:

<a href='college/<?= $id;?>'><?= $name;?></a>

基本上会呈现代码如下:

<a href='http://localhost/yourapp/college/5'>Some Community College</a>


更新1:在@Frank Farmer的评论之后,我建议保留自动递增id字段,但在网址中使用此字段撤消。相反,以编程方式生成单独的字母数字SEOid并将其用于搜索引擎优化。相同的基本链接结构。

答案 2 :(得分:0)

有点晚了,但发生在我身上,我发现了这个解决方案。

问题出在CI的 URI 类的 _filter_uri 函数中。这就是他们在该职能中所做的事情:

// Convert programatic characters to entities
$bad    = array('$',        '(',        ')',        '%28',      '%29');
$good   = array('&#36;',    '&#40;',    '&#41;',    '&#40;',    '&#41;');

return str_replace($bad, $good, $str);

所以你必须将其反转,然后应用 rawurldecode

function view_college($college = FALSE)
{
   if($college === FALSE)
   {//no college provided
      redirect('');
   }
   $bad = array('&#36;',    '&#40;',    '&#41;',    '&#40;',    '&#41;');
   $good   = array('$',     '(',        ')',        '%28',      '%29');

   $college = str_replace($bad, $good, $college);
   $college = rawurldecode($college);