-->

PHP Preg-Replace more than one underscore

2019-02-10 16:55发布

问题:

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

回答1:

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



回答2:

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

$string = preg_replace('/_+/', '_', $string);


回答3:

Actually using /__+/ or /_{2,}/ would be better than /_+/ since a single underscore does not need to be replaced. This will improve the speed of the preg variant.



回答4:

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.



回答5:

preg_replace()

the + operator is needed

$text = "______";
$text = preg_replace('/[_]+/','_',$text);


回答6:

I'm don't the reasons you want to use preg_replace but what's wrong with:

str_replace('__', '_', $string);


回答7:

This will Accept Only Characters,numeric value or Special Character found it will replace with _
<?php
error_reporting(0);
if($_REQUEST)
{
    PRINT_R("<PRE>");
    PRINT_R($_REQUEST);
    $str=$_REQUEST[str];
    $str=preg_replace('/[^A-Za-z\-]/', '_', $str);
    echo strtolower(preg_replace('/_{2,}/','_',$str));
}
?>
<form action="" method="post">
<input type="text" name="str"/>
<input type="submit" value="submit"/>
</form>


回答8:

You can also use T-Regx library which has automatic delimiters.

pattern('_+')->replace($your_string)->with('_');