7 ответов:
Оператор
+сопоставляет несколько экземпляров последнего символа (или группы захвата).$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, но что не так с:
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