Как избавиться от «®» и «™» в строке? - PullRequest
1 голос
/ 04 января 2010

У меня есть строка типа "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 ]

8 голосов
/ 04 января 2010

Возможно, у вас есть специальные символы в форме сущности , т. Е. ® действительно ® в строке Так что это не видно при операции замены.

Чтобы исправить это, вы можете отфильтровать для & SOMETHING; подстрока, и удалите их. Для этого могут быть встроенные методы, например html_entity_decode .

5 голосов
/ 04 января 2010

Если вы хотите заменить только упомянутые символы, используйте

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

Обычные методы замены строк обычно бывают быстрее, и в вашем примере нет ничего , которое вы хотите заменить, и для этого потребуется мощность сопоставления с образцом механизма регулярных выражений.

РЕДАКТИРОВАТЬ из-за комментариев: Если вам нужно заменить шаблоны персонажей (как указано в предложенном вами решении), Regex действительно более уместен и практичен.

Кроме того, я уверен, что McD требует наличия обоих символов, если этот слоган используется на любом общедоступном веб-сайте

0 голосов
/ 04 января 2010

& рег; is ®, и & trade; это ™. Таким образом, вы захотите удалить все, что следует за
шаблоном &[#0-9a-z]+; перед раздачей:

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