我有一个简单的代码:
var_dump($currentUrl);
var_dump($baseUrl);
// strip out base url, so we just get slug of page
$currentSlug = str_replace($baseUrl,'',$currentUrl);
var_dump($currentSlug);
这正在输出:
string(50) "http://mysite.lcl/books/our-series/boffin-boy.html"
string(27) "http://mysite.lcl/"
string(50) "http://mysite.lcl/books/our-series/boffin-boy.html"
$currentUrl
是页面的整个URL,没有任何查询参数。baseUrl
只是网站的基本URL。$currentSlug
应该是前者而没有后者(books/our-series/boffin-boy.html
),但str_replace
似乎什么都没做。
.lcl
只是我在本地开发环境中使用的一个域结束。
我希望我只是错过了一些显而易见的东西。请帮忙吗?
编辑:正如下面的答案所强调的,string(27)
比它应该的要多。这就是我现在试图获得$baseUrl
:的方式
$baseUrl = Mage::getUrl(); // this is a core Magento function
$baseUrl = trim($baseUrl);
$baseUrl = str_replace("'0", "", $baseUrl);
$baseUrl = (string) $baseUrl;
var_dump(addslashes($baseUrl));
// outputs the same length, string(27)
这里似乎有人遇到了同样的问题——https://magento.stackexchange.com/questions/100579/why-doesnt-this-url-comparison-work
即使它是一个Magento函数,也应该有一个纯PHP来从我需要的变量中提取字符,不是吗?
如果查看$baseUrl
的var_dump()
输出,它显示字符串长度为27,但仅显示18个字符。字符串中必须有隐藏字符,这就是函数在$currentUrl
中找不到它的原因。
尝试用var_dump(addslashes($baseUrl));
检查里面的内容并删除隐藏的字符。那么它应该会起作用。还有一个问题,变量是如何创建的。我打赌'0
字节是以某种方式添加的。
如果字符串中包含'0
字节,则删除它们:
str_replace("'0", "", $baseUrl);
然后你的更换应该可以正常工作。
为什么第二行包含27个字符?
string(27) "http://mysite.lcl/"
这个代码对我有效:
<?php
$currentUrl = 'http://mysite.lcl/books/our-series/boffin-boy.html';
$baseUrl = 'http://mysite.lcl/';
var_dump($currentUrl);
var_dump($baseUrl);
// strip out base url, so we just get slug of page
$currentSlug = str_replace($baseUrl,'',$currentUrl);
var_dump($currentSlug);
您尝试过preg_replace()吗?
$url='http://mysite.lcl/books/our-series/boffin-boy.html';
var_dump(preg_replace("/(http|https):'/'/((?:[a-z][a-z'.'d'-]+)'.(?:[a-z][a-z'-]+))(?!['w'.])/is", '', $url));
输出:
string(33) "/books/our-series/boffin-boy.html"