2

我需要 preg_replace 多个相同的字母(只有 AZ 或 az,不是数字)连续三个相同的字母。任何人都可以帮我一个模式字符串吗?

例子:

输入:NO MEK PUCES CUDAK AVVVVVVVVVVVVVVVVVVVVVVVVVV VASMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

输出:没有 MEK PUCES CUDAK AVVV VASMAAA

4

2 回答 2

6

使用组 ( ([A-Za-z])) 和反向引用 ( \1)。

$text = "NO MEK PUCES CUDAK AVVVVVVVVVVVVVVVVVVVVVVVVV VASMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";    
echo preg_replace('/([A-Za-z])\1{3,}/', "$1$1$1", $text);
# => NO MEK PUCES CUDAK AVVV VASMAAA
于 2013-08-02T12:43:21.170 回答
3

您可以使用带有反向引用的正则表达式:

preg_replace('/(.)\1+/', '$1', $str);

(.)匹配任何字符并将其放入捕获组。\1是对同一组的引用,并且+限定了它可能出现一次或多次的前一个标记。因此,这会将至少两个相同字符的任何运行替换为一个。

如果您希望保留多个字符,如您的示例所示,您可以使用以下内容:

preg_replace('/(.)\1{2,}/', '$1$1$1', $str);

如果您需要限制字符集,则只需将 替换.为字符类,例如[a-zA-Z].

于 2013-08-02T12:42:08.730 回答