2009-04-29 7 views
4

Мне нужно преобразовать любую букву, которая происходит дважды или более в одном слове, с одной буквой.Как заменить двойные буквы на одну букву?

Например:

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

Я попытался следующие, но застрял на втором параметре в eregi_replace.

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

Если я использую \\\1 заменить?, Он будет отображать точное совпадение. Как сделать это одной буквой?

Может ли кто-нибудь помочь? Спасибо

ответ

8

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

Кстати: вы должны использовать preg_* функции (PCRE) вместо устаревших ereg_* функций (POSIX). Ответ

Richard Szalay «S ведет правильный путь:

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

Чувак, это является удивительным. Думаю, мне нужно переключиться на PCRE! Благодаря! –

+0

'\ w' соответствует не только буквам. Он соответствует '[a-zA-Z0-9_]'. – Will

2

Вы не только захватываете всю вещь (а не только первый символ), но {2,} реванш [a-z] (а не оригинальное совпадение). Он должен работать, если вы используете:

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

Какая обратная ссылка на исходный матч. Вы можете заменить \ w на [a-z], если хотите.

+ требуется для вашего примера Goooogle (для механизма JJ-regex, во всяком случае), но я не уверен, почему.

Помните, что вам нужно будет использовать флаг "global" ("g").

1

Попробуйте это:

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

Как это работает:

/ .../ # 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. 
Смежные вопросы