2009-04-29 7 views
4

J'ai besoin de convertir n'importe quelle lettre qui se produit deux fois ou plus dans un mot avec une seule lettre de lui-même.Comment remplacer deux lettres ou plus par une seule lettre?

Par exemple:

School -> Schol 
Google -> Gogle 
Gooooogle -> Gogle 
VooDoo -> Vodo 

J'ai essayé ce qui suit, mais coincé au second paramètre dans eregi_replace.

$word = 'Goooogle'; 
$word2 = eregi_replace("([a-z]{2,})", "?", $word); 

Si je \\\1 pour remplacer?, Il afficherait le match exact. Comment puis-je en faire une lettre unique?

Quelqu'un peut-il aider? Merci

Répondre

8

Voir regular expression to replace two (or more) consecutive characters by only one?

A propos: vous devez utiliser les fonctions au lieu des fonctions dépréciées ereg_*preg_* (PCRE) (POSIX).

la réponse de » Richard Szalay mène la bonne façon:

$word = 'Goooogle'; 
$word2 = preg_replace('/(\w)\1+/', '$1', $word); 
+1

Mec, qui est impressionnant. Je suppose que je dois passer à PCRE! Merci! –

+0

'\ w' correspond plus que simplement à des lettres. Cela correspond '' [a-zA-Z0-9_] '. – Will

2

Non seulement vous capturez la chose entière (au lieu de seulement le premier caractère), mais {2,} rematching [a-z] (pas la correspondance d'origine). Cela devrait fonctionner si vous utilisez:

$word2 = eregi_replace("(\w)\1+", "\\1", $word); 

Quels référentiels correspondent à l'original. Vous pouvez remplacer \ w par [a-z] si vous le souhaitez.

Le + est requis pour votre exemple Goooogle (pour le moteur JS regex, de toute façon), mais je ne sais pas pourquoi. Rappelez-vous que vous aurez besoin d'utiliser le drapeau "global" ("g").

1

Essayez ceci:

$string = "thhhhiiiissssss hasss sooo mannnny letterss"; 
$string = preg_replace('/([a-zA-Z])\1+/', '$1', $string); 

Comment cela fonctionne:

/ .../ # Marks the start and end of the expression. 
([a-zA-Z]) # Match any single a-z character lowercase or uppercase. 
\1+  # One or more occurrence of the single character we matched previously. 

$1   
\1+  # The same single character we matched previously. 
Questions connexes