用下划线替换 URL 中的空格

Posted

技术标签:

【中文标题】用下划线替换 URL 中的空格【英文标题】:Replace spaces in URL with underline 【发布时间】:2009-02-24 18:46:12 【问题描述】:

如何将 URL 中的空格替换为下划线 (_)?

$query = mysql_query("SELECT * FROM users WHERE username = '$_GET[user]'");

但是如果用户在她/他的用户名中有空格,我想用下划线替换空格。 所以 profile.php?user=John Johnson 的 URL 是 profile.php?user=John_Johnson。

我该怎么做?

谢谢!

【问题讨论】:

【参考方案1】:

正如在其他地方提到的,str_replace 会做你特别需要的,但是......

我会更担心profile.php?user=John' DROP DATABASE--

不要构建这样的查询。曾经。原因之一见SQL Injection。看看this article 的正确方法。

哦,还有a comic 用作记忆辅助来强化你永远不应该这样做。

编辑:响应您的回复(您最好编辑您的原始问题,以便很明显您正在澄清您的问题)。如果您将用户“John Johnson”存储在数据库中,但您想使用 URL profile.php?user=John_Johnson 访问他,则需要反转您正在执行的替换:

 $user  = str_replace('_', ' ', $_GET['user']);
 $user  = mysql_escape_string($user);
 $query = mysql_query("SELECT * FROM users WHERE username = '$user'");

 // finns inte användaren så skriver vi ut ett felmeddelande
 if (!mysql_num_rows($query)) exit('<p>The user you are looking for appears to be          missing.</p>');

这将采用 profile.php?user=John_Johnson 并生成 sql 查询:SELECT * FROM users WHERE username = 'John Johnson'

您回复的示例代码将采用 profile.php?user=John Johnson 并生成 sql 查询:SELECT * FROM users WHERE username = 'John_Johnson' 我怀疑这与您想要的相反。

但同样,我强烈建议您查看准备好的语句。 mysql_escape_string 确实是权宜之计。只需忘记使用一次,您的网站就会被黑客入侵。

【讨论】:

中肯的建议,但这不是问题的答案。像这样的东西应该张贴在 cmets 中。【参考方案2】:

不要根据未经检查的用户输入创建 SQL 字符串。

至少在第一眼看到mysql_escape_string()to avoid being hacked:

$user  = str_replace(' ', '_', $_GET[user]);
$user  = mysql_escape_string($user);
$query = mysql_query("SELECT * FROM users WHERE username = '$user'");

【讨论】:

【参考方案3】:

由于您不需要正则表达式来执行此替换,因此您应该避免使用它们,因为它们的开销很大。

此外,由于您只关注字符而不是字符串,因此您应该使用为字符到字符映射编写的函数:strtr()

$result = strtr($original, " ", "_");

【讨论】:

【参考方案4】:

str_replace?

【讨论】:

【参考方案5】:

像这样使用str_replace():

$query = mysql_query("SELECT * FROM users WHERE username = 'str_replace(' ', '_',$_GET[user])'");

【讨论】:

【参考方案6】:

您可以使用 str_replace 或 strtr 在实际变量中替换它。 Strtr 通常显示得更快。

$newUsername = strtr($_GET['user'], ' ', '_');

应该这样做,你的新查询:

$query = mysql_query("SELECT * FROM users WHERE username = '$newUsername'");

【讨论】:

【参考方案7】:

比夫,

试试这个:

$user = urldecode($_GET['user']);

$user 现在包含“John Smith”而不是“John%20Smith”,我认为这就是查询失败的原因。

$user = mysql_escape_string($user);
$query = mysql_query("SELECT * FROM users WHERE username = $user");

您的问题似乎与阻止匹配的 URL 编码字符有关。希望对您有所帮助。

【讨论】:

【参考方案8】:

str_replace 函数正是您所寻找的。 (还有一些其他的选择,但 str_replace 对于这种情况就足够了)

$query = mysql_query("SELECT * FROM users WHERE username = '" . str_replace(' ', '_', $_GET[user] . "'");

警告:您应该认真阅读有关 SQL 注入的内容。下面是一些介绍:

http://sk.php.net/security.database.sql-injection

【讨论】:

【参考方案9】:

奇怪的是,您的代码似乎都不起作用... 我在数据库中有一个名为 John Johnson 的用户。它适用于没有空间的那些。

代码:

     $user  = str_replace(' ', '_', $_GET['user']);
     $user  = mysql_escape_string($user);
     $query = mysql_query("SELECT * FROM users WHERE username = '$user'");

     // finns inte användaren så skriver vi ut ett felmeddelande
     if (!mysql_num_rows($query)) exit('<p>The user you are looking for appears to be          missing.</p>');

【讨论】:

【参考方案10】:

您可能想查看preg_replace() 并将所有“”替换为“_”,如下所示:

$result = preg_replace("\s", "_", $_GET['user']);

但您不应该将用户输入直接放入这样的查询中。查看 PHP 输入敏感化。

编辑:抱歉忘记了正则表达式需要 \s 来表示空格。

【讨论】:

【参考方案11】:
$path = "your website and the path here"; // like http://***.com/index.php?id=1
$page = $_SERVER["QUERY_STRING"];
if(stristr($page, ' ')) 
    $page = str_replace(" ","_" , $page);
    $page = str_replace("%20%","_" , $page);
    $page = str_replace("%20","_" , $page);
    $page = str_replace("q=","" , $page);
    echo "<meta http-equiv=\"refresh\" content=\"0; url=$path/$page\" />";
    die();

如果你有类似 website.com/index.phphdsdhdh 这样的页面 你应该删除这一行

$page = str_replace("q=","" , $page);

如果你想停止 sql 注入,你可以使用

addslashes();

或使用此功能

$page = strtolower($_SERVER["QUERY_STRING"]); if(stristr($page, 'union' or stristr($page, 'and' or stristr($page, 'or' or stristr($page, 'select') die("sql injection attack");

把它放在配置中

【讨论】:

欢迎来到 SO!发布代码时,请确保通过选择文本并点击花括号按钮 对其进行格式化

以上是关于用下划线替换 URL 中的空格的主要内容,如果未能解决你的问题,请参考以下文章

用空格替换要素名称中的所有下划线

递归下用文件名的下划线替换空格

sh 用下划线替换空格

用下划线替换空格

Netezza 用下划线替换空白

用php替换带下划线的空格[关闭]