如何摆脱字符串中的“®”和“™”?

时间:2010-01-04 15:21:45

标签: php regex string html-entities

我有一个像"Welcome to McDonalds®: I'm loving it™"这样的字符串...我想摆脱":""'"®符号。到目前为止,我已尝试过以下内容:

$string = "Welcome to McDonalds®: I'm loving it™";
$string = preg_replace('/[^a-zA-Z0-9 -]/', '', $string); 

但在我收到的输出上:

"Welcome to McDonaldsreg Im loving ittrade" ...所以preg_replace以某种方式将®转换为'reg'转换为'trade',这对我和我无法理解为什么会发生这样的转换。

如何摆脱这种转变?

解决了: 感谢您的想法,伙计们。我解决了这个问题:

$string = preg_replace(
    array('/[^a-zA-Z0-9 -]/', '/&[^\s]*;/'), 
    '', 
    preg_replace(
        array('/&[^\s]*;/'), 
        '', 
        htmlentities($string)
    )
);

3 个答案:

答案 0 :(得分:8)

您可能正在使用entity形式的特殊字符,即®在字符串中确实是®。所以更换操作没有看到它。

要解决此问题,您可以过滤& SOMETHING;子串,并删除它们。可能有内置方法来执行此操作,可能是html_entity_decode

答案 1 :(得分:5)

如果您只想更换上述字符,请使用

$cleaned = str_replace(array('®','™','®','™', ":", "'"), '', $string);

常规字符串替换方法通常更快,并且您想要替换的示例中没有需要正则表达式引擎的模式匹配能力。

由于评论而编辑: 如果您需要替换字符模式(如您自己提供的解决方案所示),正则表达式确实更合适和实用。

此外,我确信如果在任何公共网站上使用该口号,McD需要两个符号

答案 2 :(得分:0)

®是®,而™是™。因此,您需要删除之前的模式&[#0-9a-z]+;之后的任何内容:

$input = "Remove all ™ and ® symbols, please.";
$string = preg_replace("/&[#0-9a-z]+;/i", "", $input);