Не удается удалить специальные символы с помощью str_replace - PullRequest
3 голосов
/ 02 июля 2010

У меня очень тривиальная проблема с 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, то же самое для сортировки БД.

Ответы [ 8 ]

9 голосов
/ 03 июля 2010

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

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, это &ndash;. Все остальное означает другой символ ...

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

3 голосов
/ 19 сентября 2012

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

1 голос
/ 25 сентября 2013

Я все перепробовал и ничего не получалось.но в конце концов с помощью 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);
1 голос
/ 02 июля 2010

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

0 голосов
/ 05 октября 2017

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

$new_string = str_replace('&#8211;', 'or', $string);
0 голосов
/ 27 сентября 2013

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

$string = str_replace("\x96", "-", $string);
0 голосов
/ 22 мая 2012

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

$string = str_replace(chr(hexdec('3f')), '-', $string);
0 голосов
/ 02 июля 2010

Попробуйте:

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

Или:

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

По сути, это то же самое, что и:

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