PHP birden fazla çizgi Preg-değiştirin

6 Cevap php

Nasıl preg_replace kullanarak yapmak, sadece bir çizgi ile birden fazla yerine alt çizgi?

6 Cevap

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

+ operatörü son karakter (ya da yakalama grubunun) birden çok örneğini eşleşir.

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

Testleri çalışan, bunu buldum:

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

Bu daha tutarlı daha hızlı olması için:

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

Ben bu konuda değişen uzunlukta testi dizeleri oluşturulur:

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

ve bu komut ile test (ayrı ayrı çalıştırılır, ancak her değeri için aynı dizeleri üzerinde $len):

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

ve:

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

Kısa dizeleri * str_replace () * yöntemi * preg_replace daha 25 kadar% daha hızlı idi () * yöntemi. Uzun dize, daha az fark, ancak * str_replace () * her zaman daha hızlı oldu.

Ben bazı hızı dışındaki nedenlerle diğer bir metodu tercih biliyorum, ve ben vs sonuçlar, test yöntemi, ilgili yorumları okumak için memnun olurdum

Aslında kullanarak /__+/ veya tek bir çizgi değiştirilmesi gerekmez beri /_{2,}/ /_+/ daha iyi olurdu. Bu gebelik varyantın hızını artıracaktır.

Ben preg_replace kullanmak istiyorum ama nesi nedenleri yok değilim:

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

preg_replace()

+ operatörü gerekli

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