PHP Preg-замена нескольких символов подчеркивания



Как я могу, используя preg_replace, заменить более одного подчеркивания только одним подчеркиванием?

604   7  

7 ответов:

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

Оператор + сопоставляет несколько экземпляров последнего символа (или группы захвата).

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

На самом деле использование /__+/ или /_{2,}/ было бы лучше, чем /_+/, так как единственное подчеркивание не нуждается в замене. Это позволит повысить скорость работы preg-варианта.

Запустив тесты, я обнаружил следующее:

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

Быть последовательно быстрее, чем это:

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

Я сгенерировал тестовые строки различной длины следующим образом:

$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);

И протестированы с помощью этих скриптов (запускаются отдельно, но на одинаковых строках для каждого значения $len):

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

И:

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

Для более коротких строк методstr_replace () был на целых 25% быстрее, чем методpreg_replace () . Чем длиннее струна, тем меньше разница, но str_replace () всегда был быстрее.

Я знаю, что некоторые предпочитают один метод другому по причинам, отличным от скорости, и я был бы рад прочитать комментарии относительно результатов, метода тестирования и т. д.

Preg_replace()

Оператор + необходим

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

Я не знаю причин, по которым вы хотите использовать preg_replace, но что не так с:

str_replace('__', '_', $string);
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>

Comments

    Ничего не найдено.