使用斜杠转换url分隔符


converting url sperators with slash

我有一个这样命名的类别:

$name = 'Construction / Real Estate';

这是两个不同的类别,我正在显示数据库中的结果为他们每个人。但在此之前,我必须将一个用户发送到url,只用于该类别。

如果我做了这样的事,问题就来了。

echo "<a href='site.com/category/{$name}'> $name </a>"; 

URL将变为

site.com/cateogry/Construction%20/%20Real%20Estate

我正试图删除%20并使其成为/所以,我做了str_replace('%20', '/', $name);但这将变成这样:

site.com/cateogry/Construction///Real/Estate
                              ^ ^ and ^ those are the problems.

由于它是一个单词,我希望它只显示为Construction/RealEstate

我可以通过使用至少10行代码来做到这一点,但我希望有一个regex和简单的php方法来修复它。

您有一个供人类使用的字符串,并基于该字符串创建一个URL。

为了避免任何字符扰乱HTML,或者像XSS攻击一样被滥用,您需要使用htmlspecialchars():在HTML的上下文中转义人类可读的字符串

$name = 'Construction / Real Estate';
echo "<h1>".htmlspecialchars($name)."</h1>;

如果该名称应进入URL,则还必须对其进行转义:

$url = "site.com/category/".rawurlencode($name);

如果任何URL应该进入HTML,则必须为HTML:进行转义

echo "<a href='".htmlspecialchars($url)."'>";

现在URL中斜杠的问题是,即使在URL中转义了斜杠,它们也很可能不被接受为常规字符。任何空格字符也不能很好地融入URL,尽管它们可以工作。

然后就是搜索引擎优化的黑魔法。

无论出于何种原因,在将类别字符串作为URL的一部分插入之前,都应该转换它。在编码之前先这样做。

一般来说,小写字符更好,空格应该是短划线,斜线可能也应该是短划:

$urlname = strtr(mb_strtolower($name), array(" " => "-", "/" => "-"));

再说一遍:

$url = "site.com/category/".rawurlencode($urlname);
echo "<a href='".htmlspecialchars($url)."'>";

事实上,仅仅使用htmlspecialchars()是不够的。进入HTML属性的输出的转义与元素内容的输出不同。如果你看一下Zend Framework 2中的escaper类,你会发现转义HTML属性值的整个过程要复杂得多

不,你不能做任何事情让它更容易。唯一的机会是使用一个函数,该函数可以完成所需的一切,使事情变得更容易,但您仍然需要在任何地方应用正确的转义。

您可以使用这样一个简单的解决方案:

$s = "site.com/cateogry/Construction%20/%20Real%20Estate";
$s = str_replace('%20', '', $s);
echo $s; // site.com/cateogry/Construction/RealEstate

也许,您想使用urldecode()并在之后删除空白?