Как заменить двойные / более буквы на одну букву? - PullRequest
4 голосов
/ 29 апреля 2009

Мне нужно преобразовать любую букву, встречающуюся в слове дважды или более, в одну букву.

Например:

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 29 апреля 2009

См. регулярное выражение для замены двух (или более) последовательных символов только одним?

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

Ричард Сзалай ответ ведет правильно:

$word = 'Goooogle';
$word2 = preg_replace('/(\w)\1+/', '$1', $word);
2 голосов
/ 29 апреля 2009

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

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

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

Знак + требуется для вашего примера Goooogle (в любом случае для движка JS regex), но я не уверен, почему.

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

1 голос
/ 18 июля 2015

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

$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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...