str_replace不起作用,即使搜索参数看起来和主题的部分相同


str_replace not working even though search parameters look identical to portion of subject

我有一个简单的代码:

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来从我需要的变量中提取字符,不是吗?

如果查看$baseUrlvar_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"