Как я, используя preg_replace, заменяю более одного подчеркивания только одним подчеркиванием?
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>