str_replace() 不适用于以下情况

str_replace() not working for the following case

我想使用 str_replace() 在 html 字符串周围放置 span 元素以突出显示它们。

然而,当字符串中有   时,以下内容不起作用。我试过用 ' ' 替换   但这没有帮助。


实例

您可以使用以下代码重现问题:

$str_to_replace = "as a way to incentivize more purchases.";

$replacement = "<span class='highlighter'>as a way to incentivize&nbsp;more purchases.</span>";

$subject = file_get_contents("http://venturebeat.com/2015/11/10/sources-classpass-raises-30-million-from-google-ventures-and-others/");

$output = str_replace($str_to_replace,$replacement,$subject);

.highlighter{
    background-collor: yellow;
}

所以我尝试了你的代码并 运行 解决了你遇到的同样问题。有趣,对吧?问题是在"incentivize"中的"e"和“more”之间其实还有一个字符,这样做可以看到,将$subject分成两部分,在文本[之前=13=] 及之后:

// splits the webpage into two parts
$x = explode('to incentivize', $subject);

// print the char code for the first character of the second string
// (the character right after the second e in incentivize) and also
// print the rest of the webpage following this mystery character
exit("keycode of invisible character: " . ord($x[1]) . " " . $x[1]);

输出:keycode of invisible character: 194 Â more ...,看!这是我们的神秘角色,它的字符码是 194!

也许这个网站嵌入了这些字符,使您很难准确地完成您正在做的事情,或者这只是一个错误。在任何情况下,您都可以使用 preg_replace 而不是 str_replace 并像这样更改 $str_to_replace

$str_to_replace = "/as a way to incentivize(.*?)more purchases/";

$replacement = "<span class='highlighter'>as a way to incentivize more purchases.</span>";

$subject = file_get_contents("http://venturebeat.com/2015/11/10/sources-classpass-raises-30-million-from-google-ventures-and-others/");

$output = preg_replace($str_to_replace,$replacement,$subject);

现在这就是你想要的。 (.*?) 处理神秘的隐藏字符。您可以进一步缩小此正则表达式,或者至少将其限制在最大字符数 ([.]{0,5}),但无论哪种情况,您都可能希望保持灵活性。

你可以用这个更简单的方法来做到这一点:

$subject = str_replace("\xc2\xa0", " ", $subject);

这将用标准 space 替换所有 &nbsp; 个字符。

您现在可以继续您的代码,但将所有 &nbsp; 替换为常规 space