2010-07-02 16 views
3

J'ai un problème très trivial avec str_replace.Impossible de supprimer des caractères spéciaux 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 est

I want to remove the – the dash 

Je veux faire:

$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 comme "moins" (j'entre la valeur avec la touche moins) mais pour une raison étrange la sortie est & ndash;

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

+0

Je ne peux pas rep Corrigez le problème avec votre exemple de code. S'il s'agit d'un problème d'encodage, vous devrez peut-être l'enregistrer dans un fichier et l'uploader quelque part ... –

+0

Le code que vous avez collé fonctionne. Donc, clairement, votre problème est autre chose ... – SoapBox

Répondre

9

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

Ça va convertir la chaîne dans les encodages octet individuel (le transformer en une chaîne hexagonale comme 48 65 6C 6C 6F (Hello Si vous voyez "2D" où se trouve le tiret, c'est un signe moins littéral ... Si vous voyez la séquence des trois octets E2 80 93, c'est &ndash;. signifie un caractère différent ...

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

+0

Avec votre premier str_replace, tout fonctionne! Maintenant, je suis curieux de savoir pourquoi je produit ndash au lieu de moins ... Je vais jeter un oeil aux chaînes hexagonales. Merci beaucoup! – Pennywise83

+0

Eh bien, alors le problème était que votre fichier de code source n'était pas réellement UTF-8 (Le caractère que vous pensiez être ndash était autre chose) ... Si vous utilisez le jeu de caractères UTF-8, ajoutez toujours le UTF-8 '' paramètre à 'html (_entity_decode | entités | specialchars)' – ircmaxell

+0

Cela a fonctionné très bien, merci! –

0

Essayez ceci:

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

Ou:

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

Il est fondamentalement identique:

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

J'ai essayé tout cela, mais sans fortune. Je ne peux vraiment pas comprendre. Dans le db le pointillé comme stocké -, pas dans "& ndash;" forme mais quand je la sortie montre que "& n dash" ... – Pennywise83

1

Il y a &ndash; (-) et il y a le signe moins (-). Assurez-vous que vous n'essayez pas de remplacer le mauvais caractère.

+0

Je suis sûr que c'est & ndash, j'ai regardé la source html. – Pennywise83

+0

Si vous voulez dire littéralement '–', la première solution de sAc devrait s'appliquer. Es-tu en train d'échapper la sortie avec 'htmlentities()'? Remplacez-vous avant ou après l'évasion? –

+0

Non aux deux questions. C'est très étrange. Je vais mettre à jour le PO avec le code exact que j'ai. – Pennywise83

0

littérale Cela a été ma solution pour un ndash invalide:

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

i » ve réussi à faire cela en appelant remove_filter('the_title', 'wptexturize'); dans functions.php puis vous effectuez un str_replace ou quoi que ce soit par "-" signe;

+0

J'ai 'Erreur fatale: Appel à la fonction indéfinie remove_filter()' –

1

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

ce code a travaillé 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); 
0

Seule cette solution a fonctionné pour moi:

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

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

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