我有一个这样命名的类别:
$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()并在之后删除空白?