PHP str_replace

6 Cevap php

Şu anda hemen ondan sonra bir usrID ve 'virgül' kaldırmak için str_replace kullanıyorum:

Örneğin:

$usrID = 23;
$string = "22,23,24,25";
$receivers = str_replace($usrID.",", '', $string);  //Would output: "22,24,25"

Ancak, eğer fark ettik:

$usrID = 25; //or the Last Number in the $string

'25 Sonra firar 'virgül' yoktur, çünkü çalışmıyor

Ben dize belirli bir sayıda kaldırma olabilir daha iyi bir yolu var mı?

Teşekkürler.

6 Cevap

YOu bir diziye dize patlayabilir:

$list = explode(',', $string);
var_dump($list);

Size verecektir:

array
  0 => string '22' (length=2)
  1 => string '23' (length=2)
  2 => string '24' (length=2)
  3 => string '25' (length=2)

Sonra, bu dizi üzerinde istediğiniz her şeyi; gibi artık istemediğiniz girdiyi kaldırın:

foreach ($list as $key => $value) {
    if ($value == $usrID) {
        unset($list[$key]);
    }
}
var_dump($list);

Size verir:

array
  0 => string '22' (length=2)
  2 => string '24' (length=2)
  3 => string '25' (length=2)

Ve nihayet, tekrar bir araya adet koyun:

$new_string = implode(',', $list);
var_dump($new_string);

Ve ne istediğini olsun:

string '22,24,25' (length=8)

Belki bir regex gibi "basit" olarak; ancak elemanları (veya unsurlar sadece düz sayılar daha karmaşık gün) ile daha fazlasını yapmak gerekir gün, hala :-) çalışacağız


EDIT: ve iki virgül varken gibi "boş" değerlerini kaldırmak istiyorsanız, sadece biraz bu gibi durumu, modifiy var:

foreach ($list as $key => $value) {
    if ($value == $usrID || trim($value)==='') {
        unset($list[$key]);
    }
}

yani, $values bu boş hariç. "trim" $string = "22,23, ,24,25"; da, btw ele böylece kullanılır.

Başka bir mesele, bir kullanıcı 5 var ve bunları kaldırmaya çalışın eğer her iki tarafta bir virgül kontrol etmek olurdu Yani, vs, 2'ye, 1'e 25, 15 açmak istiyorum olduğunu.

Eğer böyle bir sınırlandırılmış bir dize olmasını istiyorsanız, ben çok uzun alırsa bu verimsiz olurdu ama, arama ve liste hem de her iki ucunda bir virgül koymak istiyorum.

Bir örnek olacaktır:

$receivers = substr(str_replace(','.$usrID.',', ',', ','.$string.','),1,-1);

Pascal ile benzer bir seçenek, ben biraz simipler düşünüyorum ancak:

$usrID = 23;
$string = "22,23,24,25";
$list = explode(',', $string);
$foundKey = array_search($usrID, $list);
if ($foundKey !== false) {
    // the user id has been found, so remove it and implode the string
    unset($list[$foundKey]);
    $receivers = implode(',', $list);
} else {
    // the user id was not found, so the original string is complete
    $receivers = $string;
}

Temel olarak, bir diziye dize dönüştürmek kullanıcı kimliğini bulmak, eğer varsa, unset bu ve daha sonra tekrar dizi patlar.

Ben basit bir yol gider: Tek bir virgül ile ", 23" yerine listenizde etrafında virgül eklemek sonra ekstra virgül kaldırın. Hızlı ve basit.

$usrID = 23;
$string = "22,23,24,25";
$receivers = trim(str_replace(",$usrID,", ',', ",$string,"), ',');

Bunu dedi, virgülle ayrılmış liste değerleri işleyerek, genellikle kötü bir tasarım imzalamak. Bu değerler bir dizi yerine olmalıdır.

Preg kullanmayı deneyin:

<?php
$string = "22,23,24,25";
$usrID = '23';
$pattern = '/\b' . $usrID . '\b,?/i';
$replacement = '';
echo preg_replace($pattern, $replacement, $string);
?>

Update: changed $pattern = '/$usrID,?/i'; to $pattern = '/' . $usrID . ',?/i'; Update2: changed $pattern = '/' . $usrID . ',?/i to $pattern = '/\b' . $usrID . '\b,?/i' to address onnodb's comment...

(Tüm 2 haneli numaralarını vererek) basit bir yolu:

$string = str_replace($userId, ',', $string);
$string = str_replace(',,','', $string);