У меня очень тривиальная проблема с 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
это означает, что это буквальный –
, поэтому вам нужно будет выполнить str_replace('–', '', $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('–','',$string);
Или:
$new_string = str_replace(html_entity_decode('–'),'',$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('–', 'or', $string);