Bir dizenin belirli bir karakterden sonraki kısmını kaldırma


144

Ben sadece PHP belirli bir alt dize sonra her şeyi nasıl kaldırabilirsiniz merak ediyorum

örn:

Posted On April 6th By Some Dude

Ben "By" alt dizesi dahil ve sonra, tüm metni kaldırmasını istiyorum

Teşekkürler


1
Alt dize iki kez (veya daha fazla) oluşursa ne olur?
Bart Kiers

18
Bir not olarak, bunu bir başkasının içeriğini alıp kendi sitenizde sunabilmek için yapıyorsanız yapmayın .
ceejayoz

Ceejayoz'a katılıyorum. Bu, gerçekten erişiminiz olmayan içeriği kullanmaya çalıştığınıza ve orijinal yazarla ilgili herhangi bir referansı kaldırmaya çalıştığınıza çok benziyor. Bu çok hoş olmaz ...
selfawaresoup


1
Bir CMS tarafından oluşturulan içerikle çalışırken meşru nedenlerle bu tür bir şey yapmak aslında yaygındır. Bunun nedeni, güncellemelerinizi kıracağınız için böyle bir pasaj oluşturan gerçek kodla asla uğraşmak istememenizin nedeni; yani, kendi işini yapmasına izin veriyorsun, o zaman işini yapıyorsun.
Nosajimiki

Yanıtlar:


292
$variable = substr($variable, 0, strpos($variable, "By"));

Sade ingilizce: Dizenin başında başlayan ve sınırlayıcıyla ilk karşılaştığınız yerde biten kısmını verin.


11
Peki ya "sadece" tarafından "bunu yaparsanız?
Alisso

3
Haklısın. "By" bulunmazsa strpos FALSE döndürür. substr, verilen uzunluk yanlışsa boş bir dize döndürür. Pratikte, muhtemelen "By" 'un var olup olmadığını kontrol etmek ve sonra sadece eğer varsa bunu yapmak yararlı olacaktır (aksi takdirde sadece ipi yalnız bırakmak).
Austin Fitzpatrick

13
Bu çalışır: strpos ($ değişkeni, "By")? substr ($ değişken, 0, strpos ($ değişken, "By")): $ değişken;
Noah Gary

Aşağıda herşeye hitap ettiğini düşündüğüm bir cevap koydum ve ayrıca büyük / küçük harfe duyarsız, çoklu olaylar ve düzenli ifadeler gibi her türlü şeyle başa çıkmanın yollarını açıklıyorum. Herkes daha esnek bir şey yapmak istiyorsa veya gelen girdi üzerinde kontrol sahibi değilse, muhtemelen kontrol etmeye değer.
azoundria

1
Benim için mükemmel çalışıyor @ Goahnary!
denis

106

Eğer sen bayrağı iğne_öncesi $ bakmak 5.3+ PHP kullanıyorsanız ) (strstr

$s = 'Posted On April 6th By Some Dude';
echo strstr($s, 'By', true);

4
Teşekkürler, bu bugünlerde gerçek doğru cevap !
Matmarbon

59
FALSEDizenin bir kısmı bulunmazsa döneceğini unutmayın . Yani çözüm şöyle olabilir:echo strstr($s, 'By', true) ?: $s;
kenorb

6
^ ^ ^ kenorb'un cevabı bugün kabul edilen cevap olmalıdır. Başka bir alternatif squarecandy en olacaktı explode(' By', $s)[0]IMHO
Zack Morris

Gerçekten, kenorb'un varlık kontrolü, dizeyi test etmek gerekmese de bunu yapmanın yoludur.
BarryMode

Sadece @ kenorb'un metodu göğüsleri söylemek için burada.
Quinn Comendant

32

Kullanmaya ne dersiniz explode:

$input = 'Posted On April 6th By Some Dude';
$result = explode(' By',$input);
return $result[0];

Avantajları:


@bkac - Çalıştığı ve amortismana tabi olmadığı sürece eski modada yanlış olan ne?
squarecandy

3
Bu, kabul edilen cevabın gerektirdiği sınırlayıcı dizenin varlığı için ekstra kontrolü ortadan kaldırır.
David Cullen

17

Şunları yapabilirsiniz:

$posted = preg_replace('/ By.*/', '', $posted);
echo $posted;

4
+1 Kontrol karakterleri mevcut DEĞİLSE çalışan tek karakterdir (kontrol karakterleri kaynak dizede yoksa boş bir dize döndüren diğerlerinden farklı olarak)
Tom Auger

9

Bir yöntem şöyle olur:

$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th

Bu, By dizesinde olmasa bile çalıştığı en iyi cevaptır, substr cevabı yanlıştır çünkü doest'nt tarafından başarısız olur.
neoteknic

Bu yanlış: işlev bölünmez By, ancak 2. parametrede herhangi bir karakterle bölünür . Anlamı, ya tarafından bölecek Bveya y. Teknik olarak, a'dan önce her şeyi almıyor By.
msb

Dikkatli olun: strtok dizesinin bölümünü dönecektir sonra o dizisindeki ilk karakter ise karakterin, örneğin strtok('a:b', ':')döner aama strtok(':b', ':')dönecektir b, beklediğiniz gibi değil boş bir dize.
Quinn Comendant

6

Bunu dene.

function strip_after_string($str,$char)
    {
        $pos=strpos($str,$char);    
        if ($pos!==false) 
        {
            //$char was found, so return everything up to it.
            return substr($str,0,$pos);
        } 
        else 
        {
            //this will return the original string if $char is not found.  if you wish to return a blank string when not found, just change $str to ''
            return $str; 
        }
    }

Kullanımı:

<?php
    //returns Apples
    $clean_string= strip_after_string ("Apples, Oranges, Banannas",",");
?>

Sas yerine strip_after_string işlevini adlandırmak ve şifreli başlatmalarla dolu bir kod tabanına sahip olmak çok daha iyi olur. Yine de bu soruya en çok okunabilir cevap bu.
Anther

5

Austin'in cevabı örnek vakanız için işe yarar.

Daha genel olarak, bölündüğünüz alt dize dizeler arasında farklılık gösterebiliyorsa normal ifade işlevlerine bakmak iyi olur :

$ değişken = preg_replace ('/ By. * /', '', $ değişken);

+1, bu doğru. Ayrıca "Yazar:" veya "Yazan:" Veya "Onayı ile kullanılır: Ben herhangi bir regex mantık yok, ama, onlar hemen koduna bir karmaşıklık düzeyi eklemek gibi görünüyor onlardan kaçınmak eğilimindedir (en azından benim için)
Austin Fitzpatrick

4

Şunları listve explodeişlevlerini kullanabilirsiniz :

list($result) = explode("By", "Posted On April 6th By Some Dude", 2);
// $result is "Posted On April 6th "

Bu en doğru olanı. Keşke buna iki kez oy
John Max

4
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));


2

Normal ifadeyi kullanarak: $string = preg_replace('/\s+By.*$/', '', $string)


Lütfen yalnızca kodla ilgili bu yanıta bir açıklama ekleyin.
mickmackusa

2

Aşağıda, bir dizgideki ilk By öğesinden sonra her şeyi kesmek için en verimli yöntem (çalışma zamanına göre) verilmiştir . Eğer By yok, tam dize döndürülür. Sonuç $ sResult olur.

$sInputString = "Posted On April 6th By Some Dude";
$sControl = "By";

//Get Position Of 'By'
$iPosition = strpos($sInputString, " ".$sControl);
if ($iPosition !== false)
  //Cut Off If String Exists
  $sResult = substr($sInputString, 0, $iPosition);
else
  //Deal With String Not Found
  $sResult = $sInputString;

//$sResult = "Posted On April 6th"

Büyük / küçük harfe duyarlı olmak istemiyorsanız , strpos yerine stripos kullanın. By öğesinin birden fazla var olabileceğini düşünüyorsanız ve son olaydan sonra her şeyi kesmek istiyorsanız, strrpos kullanın .

Aşağıda daha az verimli bir yöntem olmakla birlikte, daha az kod alanı kaplar. Bu yöntem de daha esnektir ve herhangi bir normal ifade yapmanıza izin verir.

$sInputString = "Posted On April 6th By Some Dude";
$pControl = "By";

$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);

//$sResult = "Posted On April 6th"

Örneğin, günden sonra her şeyi kaldırmak istiyorsanız:

$sInputString = "Posted On April 6th By Some Dude";
$pControl = "[0-9]{1,2}[a-z]{2}"; //1 or 2 numbers followed by 2 lowercase letters.

$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);

//$sResult = "Posted On April"

Büyük / küçük harf duyarlı değilse, i değiştiricisini şu şekilde ekleyin:

$sResult = preg_replace("' ".$pControl.".*'si", '', $sInputString);

Geçen geçmiş her şeyi elde etmek By Bir ekstra ekleyin Birden fazla olabileceğini düşünüyorsanız * böyle başında.:

$sResult = preg_replace("'.* ".$pControl.".*'si", '', $sInputString);

Ama burada da yapmaya çalıştığınız şeyi yapmak için preg_match'u kullanabileceğiniz gerçekten güçlü bir yol var:

$sInputString = "Posted On April 6th By Some Dude";

$pPattern = "'Posted On (.*?) By (.*?)'s";
if (preg_match($pPattern, $sInputString, $aMatch)) {
  //Deal With Match
  //$aMatch[1] = "April 6th"
  //$aMatch[2] = "Some Dude"
} else {
  //No Match Found
}

Düzenli ifadeler ilk başta kafa karıştırıcı görünebilir, ancak onlara hakim olduktan sonra gerçekten güçlü ve en iyi arkadaşınız olabilirler! İyi şanslar!


1

Neden...

Bu, çoğu insanın ihtiyaçları için aşırı derecede doludur, ancak yukarıdaki her bir yanıtın cevaplamadığı bir takım şeyleri ele alır. Ele aldığı öğelerden üçü benim ihtiyaçlarım için gerekliydi. Sıkı basamaklama ve yorumları düşürme ile, bu sadece 13 satır kodda okunabilir kalabilir.

Bu aşağıdakilere yöneliktir:

  • REGEX ile strrpos / strstr / strripos / stristr kullanımının performans etkisi.
  • Dizede karakter / dize bulunmadığında strripos / strrpos kullanma.
  • Dizenin sol veya sağ tarafından kaldırılması (ilk veya son tekrar).
  • Büyük küçük harf duyarlılığı.
  • Arama karakteri / dizesi bulunmazsa orijinal dizgiyi değiştirmeden geri döndürmek istemek.

Kullanımı:

Orijinal dize, arama char / dize, sağ veya sol tarafta başlangıç ​​için "R" / "L", büyük / küçük harf duyarlılığı için true / false. Örneğin, "burada" büyük / küçük harfe duyarlı olmayan, dize halinde sağ tarafı başlatın.

echo TruncStringAfterString("Now Here Are Some Words Here Now","here","R",false);

Çıktı "Şimdi Burada Bazı Kelimeler" olacaktır. "R" nin "L" olarak değiştirilmesi "Now" sonucunu verir.

İşte işlevi:

function TruncStringAfterString($origString,$truncChar,$startSide,$caseSensitive)
{
    if ($caseSensitive==true && strstr($origString,$truncChar)!==false)
    {
        // IF START RIGHT SIDE:
        if (strtoupper($startSide)=="R" || $startSide==false)
        {   // Found, strip off all chars from truncChar to end
            return substr($origString,0,strrpos($origString,$truncChar));
        }

        // IF START LEFT SIDE: 
        elseif (strtoupper($startSide)=="L" || $startSide="" || $startSide==true)
        {   // Found, strip off all chars from truncChar to end
            return strstr($origString,$truncChar,true);
        }           
    }
    elseif ($caseSensitive==false && stristr($origString,$truncChar)!==false)
    {           
        // IF START RIGHT SIDE: 
        if (strtoupper($startSide)=="R" || $startSide==false)
        {   // Found, strip off all chars from truncChar to end
            return substr($origString,0,strripos($origString,$truncChar));
        }

        // IF START LEFT SIDE: 
        elseif (strtoupper($startSide)=="L" || $startSide="" || $startSide==true)
        {   // Found, strip off all chars from truncChar to end
            return stristr($origString,$truncChar,true);
        }
    }       
    else
    {   // NOT found - return origString untouched
        return $origString;     // Nothing to do here
    }           

}

Çalışma cevabımı küçümserseniz, nedenini belirttiğiniz takdir edilecektir.
Robert Mauro

0

Strstr işlevini kullanın .

<?php
$myString = "Posted On April 6th By Some Dude";
$result = strstr($myString, 'By', true);

echo $result ;

Üçüncü parametre true, işleve ikinci parametrenin ilk gerçekleşmesinden önce her şeyi döndürmesini söyler.


1
strtok($str, 'By')daha basit görünüyor
mu3

-2
$variable = substr($initial, 0, strpos($initial, "By"));

if (!empty($variable)) { echo $variable; } else { echo $initial; }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.