wake-up-neo.com

Entfernen Sie einen Teil einer Zeichenfolge nach einem bestimmten Zeichen

Ich frage mich nur, wie ich nach einem bestimmten Teilstring in PHP alles entfernen könnte

ex:

Posted On April 6th By Some Dude

Ich möchte es so haben, dass es den gesamten Text entfernt, einschließlich und nach der Unterzeichenfolge "By".

Vielen Dank

112
Belgin Fish
$variable = substr($variable, 0, strpos($variable, "By"));

Im Klartext: Geben Sie mir den Teil der Zeichenfolge, der am Anfang beginnt und an der Stelle endet, an der Sie zuerst auf den Deliminator treffen.

223

Wenn Sie verwenden, verwenden Sie PHP 5.3+ und sehen Sie sich das Flag $ before_needle von strstr ()

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

Wie wäre es mit explode:

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

Vorteile:

24
squarecandy

Du könntest es tun:

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

Eine Methode wäre:

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

Die Antwort von Austin funktioniert für Ihren Beispielfall.

Im Allgemeinen sollten Sie sich die regulären Ausdrucksfunktionen genauer ansehen, wenn sich die Teilzeichenfolge, in der Sie die Teilung ausführen, zwischen den Zeichenfolgen unterscheiden kann:

 $ variable = preg_replace ('/ By. * /', '', $ variable); 
5
jemfinch

Versuche dies.

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; 
        }
    }

Verwendungszweck: 

<?php
    //returns Apples
    $clean_string= strip_after_string ("Apples, Oranges, Banannas",",");
?>
5
Tim Yobson
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));
3
Tim Cooper

preg_replace bietet eine Möglichkeit:

$newText = preg_replace('/\bBy.*$/', '', $text);
2
outis

Sie können list und explode Funktionen verwenden:

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

Unten ist die effizienteste Methode (nach Laufzeit), um alles nach dem ersten By in einer Zeichenfolge abzuschneiden. Wenn By nicht vorhanden ist, wird die vollständige Zeichenfolge zurückgegeben. Das Ergebnis ist in $ sResult.

$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"

Wenn Sie nicht zwischen Groß- und Kleinschreibung unterscheiden möchten, verwenden Sie stripos anstelle von strpos. Wenn Sie denken, dass By mehr als einmal existieren könnte und nach dem letzten Vorkommen alles schneiden möchte, verwenden Sie strrpos .

Im Folgenden finden Sie eine weniger effiziente Methode, die jedoch weniger Code-Speicherplatz beansprucht. Diese Methode ist auch flexibler und ermöglicht es Ihnen, jeden regulären Ausdruck auszuführen.

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

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

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

Wenn Sie beispielsweise nach dem Tag alles entfernen möchten:

$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"

Wenn Sie die Groß- und Kleinschreibung nicht berücksichtigen, fügen Sie den i-Modifikator wie folgt hinzu:

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

Um alles nach dem letzten By zu bekommen, wenn Sie der Meinung sind, dass es mehr als einen gibt, fügen Sie am Anfang ein zusätzliches. * Hinzu:

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

Mit preg_match können Sie jedoch auch eine wirklich mächtige Methode einsetzen, um das zu tun, was Sie möglicherweise versuchen:

$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
}

Reguläre Ausdrücke mögen auf den ersten Blick verwirrend wirken, aber sie können wirklich mächtig und Ihr bester Freund sein, wenn Sie sie beherrschen! Viel Glück!

2
azoundria

Verwenden Sie einen regulären Ausdruck: $string = preg_replace('/\s+By.*$/', '', $string)

2
Ming-Tang

Verwenden Sie die Funktion strstr .

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

echo $result ;

Der dritte Parameter true teilt der Funktion mit, alles vor dem ersten Auftreten des zweiten Parameters zurückzugeben.

0
Faisal

Warum...

Dies ist wahrscheinlich zu viel für die Bedürfnisse der meisten Menschen, aber es spricht eine Reihe von Dingen an, die jede einzelne Antwort oben nicht tut. Von den Gegenständen, die es anspricht, wurden drei für meine Bedürfnisse benötigt. Mit einer engen Klammer und dem Löschen der Kommentare könnte dies bei nur 13 Codezeilen noch lesbar bleiben.

Dies befasst sich mit den folgenden:

  • Leistungseinbußen bei der Verwendung von REGEX gegenüber strrpos/strstr/strripos/stristr.
  • Verwenden von strripos/strrpos, wenn das Zeichen/die Zeichenfolge nicht in der Zeichenfolge gefunden wurde.
  • Entfernen von der linken oder rechten Seite der Zeichenfolge (erstes oder letztes Vorkommen).
  • CaSe-Empfindlichkeit.
  • Willst du die Fähigkeit, die ursprüngliche Zeichenfolge unverändert zurückzugeben, wenn Suche Zeichen/Zeichenfolge nicht gefunden.

Verwendungszweck:

Original-String senden, Zeichen/String suchen, "R"/"L" für Start rechts oder links, wahr/falsch für Groß-/Kleinschreibung. Suchen Sie zum Beispiel nach "hier" ohne Berücksichtigung der Groß-/Kleinschreibung. Beginnen Sie in der Zeichenfolge mit der rechten Seite.

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

Die Ausgabe wäre "Jetzt sind hier einige Wörter". Wenn Sie das "R" in ein "L" ändern, wird "Now" ausgegeben.

Hier ist die Funktion:

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
    }           

}
0
Robert Mauro