我有一个名为这样的类别:
$name = 'Construction / Real Estate';
这是两个不同的类别,我正在显示数据库的结果 对于他们每个人。但在此之前,我必须将用户发送到该类别的网址。
如果我做了类似的事情,这就是问题所在。
echo "<a href='site.com/category/{$name}'> $name </a>";
网址将变为
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行代码来实现这一点,但我希望是否有正则表达式,以及简单的PHP方法来修复它。
答案 0 :(得分:1)
您可以使用这样的简单解决方案:
$s = "site.com/cateogry/Construction%20/%20Real%20Estate";
$s = str_replace('%20', '', $s);
echo $s; // site.com/cateogry/Construction/RealEstate
答案 1 :(得分:1)
您有一个供人类消费的字符串,并根据您想要创建URL的字符串。
为了避免任何字符弄乱您的HTML,或者滥用XSS攻击,您需要使用htmlspecialchars()
在HTML上下文中转义人类可读的字符串:
$name = 'Construction / Real Estate';
echo "<h1>".htmlspecialchars($name)."</h1>;
如果该名称应该放入网址,则还必须对其进行转义:
$url = "site.com/category/".rawurlencode($name);
如果任何网址应该转换为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类,您会发现escaping a HTML attribute value的整个事情要复杂得多
不,你无法做到让事情变得更轻松。唯一的机会是使用一个功能,它可以为您提供所需的一切,但您仍然需要在任何地方应用正确的转义。
答案 2 :(得分:0)
也许,您想使用urldecode()并在之后删除空格?