Невозможно удалить специальные символы с помощью str_replace

У меня очень тривиальная проблема с str_replace.

У меня есть строка с символом En Dash (-) следующим образом:

I want to remove - the dash 

Выход html

 I want to remove the – the dash 

Я хочу сделать это:

 $new_string = str_replace ('-','',$string); 

Я попытался разобрать строку с html_entity_decode, чтобы проанализировать символ для удаления с помощью htmlspecialchars, но без каких-либо результатов.

Что я делаю неправильно?

-EDIT- Это полный код моего скрипта:

 $title = 'Super Mario Galaxy 2 - Debut Trailer'; // Fetched from the DB, in the DB the character is - (minus) not – $new_title = str_replace(' - ', '', $title); $new_title = str_replace(" - ", '', $title); $new_title = str_replace(html_entity_decode('–'),'',$title); 

Никто не работает. В основном проблема заключается в том, что в БД тире хранятся как «минус» (я вводил значение с помощью клавиши «минус»), но по какой-то странной причине выход – это & ​​ndash;

Я работаю на WordPress, а кодировка – UTF-8, то же самое для сортировки БД.

попробуйте что-то вроде этого:

 str_replace(html_entity_decode('–', ENT_COMPAT, 'UTF-8'), '', $string); 

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

 function decodeString($str) { //Fix for mb overloading strlen option if (function_exists('mb_strlen')) { $len = mb_strlen($str, '8bit'); } else { $len = strlen($str); } $ret = ''; for ($i = 0; $i < $len; $i++) { $ret .= dechex(ord($str[$i])).' '; } return trim($ret); } 

Это преобразует строку в отдельные байтовые кодировки (превратите ее в шестнадцатеричную строку, такую ​​как 48 65 6C 6C 6F ( Hello ). Проверить, что черта в обоих случаях на самом деле является одним и тем же символом. Если вы видите «2D», где черта – это буквальный знак минус … Если вы видите трехбайтную последовательность E2 80 93 , это значит … Что-нибудь еще означает другой символ …

EDIT: И если вы видите 26 6E 64 61 73 68 3B это означает, что это буквальный &ndash; , поэтому вам нужно будет выполнить str_replace('&ndash;', '', $str);

Мне удалось это сделать, вызвав remove_filter( 'the_title', 'wptexturize' ); в functions.php, тогда вы выполняете str_replace или что-то str_replace под знаком «-»;

Там есть? (-) и есть знак минус (-). Убедитесь, что вы не пытаетесь заменить неправильный символ.

Я пробовал все и ничего не работал. но в конце с помощью http://www.ascii.cl/htmlcodes.htm

этот код действительно работал для меня

  $arr1 = explode(",","0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F"); $arr2 = explode(",","B,C,D,E,F"); foreach($arr2 as $t1){ foreach($arr1 as $t2){ $val = $t1.$t2; $desc = str_replace(chr(hexdec($val)),"",$desc); } } // if need removing individual value $desc = str_replace(chr(hexdec('A2')),"",$desc); 

Попробуй это:

 $new_string = str_replace('&ndash;','',$string); 

Или:

 $new_string = str_replace(html_entity_decode('&ndash;'),'',$string); 

Это в основном то же самое, что:

 $new_string = str_replace ('-','',$string); 

Это было мое решение для недопустимого ndash:

 $string = str_replace(chr(hexdec('3f')), '-', $string); 

Только это решение сработало для меня:

 $string = str_replace("\x96", "-", $string); 

Для тех, кто пробовал все вышеперечисленное, но все еще не имел радости, это сработало для меня (из функции WordPress get_the_title() )

 $new_string = str_replace('&#8211;', 'or', $string);