我有一个像"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)
)
);
答案 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);