Question

J'ai un problème très trivial avec str_replace.

J'ai une chaîne avec le caractère Dash En (-) comme ceci:

I want to remove - the dash

La sortie HTML

I want to remove the – the dash

Je veux faire ceci:

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

J'ai essayé d'analyser la chaîne avec html_entity_decode, pour analyser le caractère à enlever avec htmlspecialchars, mais sans aucun résultat.

Qu'est-ce que je fais mal?

-Edit- Ceci est le code complet de mon script:

$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);

Personne ne travaille. Fondamentalement, le problème est que dans le DB les tirets sont stockés sous forme de « moins » (j'entre la valeur avec la touche moins), mais pour une raison étrange la sortie est & ndash;

Je suis sur Wordpress et en cours d'exécution le jeu de caractères est UTF-8, le même pour le classement DB.

Était-ce utile?

La solution

essayer quelque chose comme ceci:

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

Je pense que c'est pas vraiment un ndash, mais un caractère très similaire. Je vous suggère de tirer les valeurs d'octets de chaque caractère de la chaîne pour voir à quoi il ressemble:

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);
}

qui va convertir la chaîne dans les encodages octet individuel (le transformer en une chaîne hexagonale comme 48 65 6C 6C 6F (Hello). Vérifiez le tableau de bord dans les deux cas est en fait le même caractère. Si vous voyez « 2D » où le tableau de bord est, qui est un signe moins littéral ... Si vous voyez la séquence de trois octets E2 80 93, c'est &ndash;. Toute autre chose signifie un caractère différent ...

EDIT: Et si vous voyez que 26 6E 64 61 73 68 3B mens un &ndash; littéral, vous auriez donc besoin de faire str_replace('&ndash;', '', $str);

Autres conseils

J'ai réussi à le faire en appelant remove_filter( 'the_title', 'wptexturize' ); dans functions.php un puis vous effectuez une str_replace ou quoi que par signe « - »;

Il y a &ndash; (-) et il est le moins signe (-). Assurez-vous que vous essayez de ne pas remplacer le caractère erroné.

J'ai tout essayé et rien ne fonctionnait. mais à la fin, avec l'aide de http://www.ascii.cl/htmlcodes.htm

ce code a fait un travail pour moi

        $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);

Essayez ceci:

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

Ou:

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

Il est essentiellement identique à:

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

Ce fut ma solution pour un ndash invalide:

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

Seule cette solution a fonctionné pour moi:

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

Pour tous ceux qui ont essayé tous ce qui précède, mais en ayant toujours pas de joie alors cela a fonctionné pour moi (d'une fonction de get_the_title() WordPress)

$new_string = str_replace('&#8211;', 'or', $string);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top