PHP Preg-Replace more than one underscore

前端 未结 8 1373
难免孤独
难免孤独 2020-12-17 03:22

How do I, using preg_replace, replace more than one underscore with just one underscore?

相关标签:
8条回答
  • 2020-12-17 04:23

    The + operator matches multiple instances of the last character (or capture group).

    $string = preg_replace('/_+/', '_', $string);
    
    0 讨论(0)
  • 2020-12-17 04:25

    Running tests, I found this:

    while (strpos($str, '__') !== false) {
        $str = str_replace('__', '_', $str);
    }
    

    to be consistently faster than this:

    $str = preg_replace('/[_]+/', '_', $str);
    

    I generated the test strings of varying lengths with this:

    $chars = array_merge(array_fill(0, 50, '_'), range('a', 'z'));
    $str = '';
    for ($i = 0; $i < $len; $i++) {  // $len varied from 10 to 1000000
        $str .= $chars[array_rand($chars)];
    }
    file_put_contents('test_str.txt', $str);
    

    and tested with these scripts (run separately, but on identical strings for each value of $len):

    $str = file_get_contents('test_str.txt');
    $start = microtime(true);
    $str = preg_replace('/[_]+/', '_', $str);
    echo microtime(true) - $start;
    

    and:

    $str = file_get_contents('test_str.txt');
    $start = microtime(true);
    while (strpos($str, '__') !== false) {
        $str = str_replace('__', '_', $str);
    }
    echo microtime(true) - $start;
    

    For shorter strings the str_replace() method was as much as 25% faster than the preg_replace() method. The longer the string, the less the difference, but str_replace() was always faster.

    I know some would prefer one method over the other for reasons other than speed, and I'd be glad to read comments regarding the results, testing method, etc.

    0 讨论(0)
提交回复
热议问题