【问题标题】:php replace consecutive same multiple digits with single digitphp用单个数字替换连续相同的多个数字
【发布时间】:2019-03-19 12:19:28
【问题描述】:

我想用单个数字替换相同的连续 4 个或更多相同数字。 像 1111 => 1。 我尝试使用正则表达式作为

<?php
$str = "1111 2222 3333 4444 asdfasf 1111 2222 ";
echo preg_replace("/(^|(.)(?!\2))(\d)\3{3}(?!\3)/","<span class='background- 
color:yellow'>$1</span>",$str);

但同样不能替换。 请给我建议。谢谢。

【问题讨论】:

  • 您从那里输入的预期输出是什么? &lt;span... 部分你什么都没说,那不是用单个数字替换,那是 HTML 字符串?
  • html 我在此处添加以突出显示以进行测试。我希望多个相同的数字将替换为单个数字本身

标签: php regex replace


【解决方案1】:

您也可以这样做(它比其他答案更有效)。但我想为什么不发布一些不同的东西......

$str = "1111 2222 3333 4444 asdfasf 1111 2222 ";

$range = range(0,9);
$patterns = array_map(function($num){
    return '/'.$num.'{4,}/';
},$range);

echo preg_replace($patterns, $range, $str);

输出:

1 2 3 4 asdfasf 1 2 

Sandbox

它使用的模式基本上是/x{4,}/,其中x 是一个数字0 - 9。所以这使用一个模式数组来替换一个替换数组。这就是为什么它效率较低的原因,但他们在另一个答案中击败了我......

现在想来,也可以像这样用\1完成

$str = "1111 2222 3333 4444 asdfasf 1111 2222 ";

$patterns = array_map(function($num){
    return '/('.$num.'){4,}/';
},range(0,9));

echo preg_replace($patterns, '\1', $str);

这样它只使用 1 个数组...

Sandbox

模式数组如下所示

[
  0 => '/(0){4,}/',
  1 => '/(1){4,}/',
  2 => '/(2){4,}/',
  3 => '/(3){4,}/',
  4 => '/(4){4,}/',
  5 => '/(5){4,}/',
  6 => '/(6){4,}/',
  7 => '/(7){4,}/',
  8 => '/(8){4,}/',
  9 => '/(9){4,}/',
]

干杯!

【讨论】:

    【解决方案2】:

    使用模式

    /(\d)\1{3,}/
    

    匹配组中的一个数字,然后重复同一组 3 次或更多次,然后用匹配的数字字符替换整个匹配的子字符串:

    $1
    

    完整代码:

    $str = "1111 2222 3333 4444 asdfasf 1111 2222 ";
    echo preg_replace('/(\d)\1{3,}/', "$1", $str);
    

    输出:

    1 2 3 4 asdfasf 1 2
    

    这也将匹配属于其他数字的重复数字,例如 122221 - 如果您不希望这样,请在开头和结尾添加单词边界:

    /\b(\d)\1{3,}\b/
    

    【讨论】:

      【解决方案3】:

      尝试正则表达式(\d)\1{3,} 并替换为$1

      这将匹配连续出现四次或更多次的数字

      Regex

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-26
        • 2020-03-05
        • 1970-01-01
        • 2020-08-31
        • 2016-06-23
        • 2020-07-19
        • 2018-09-11
        • 2022-01-01
        相关资源
        最近更新 更多