Entfernen Sie einen Teil einer Zeichenfolge nach einem bestimmten Zeichen

143

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 der gesamte Text entfernt wird, einschließlich und nach der Unterzeichenfolge "By".

Vielen Dank

Belgin Fisch
quelle
1
Was ist, wenn die Unterzeichenfolge zweimal (oder öfter) vorkommt?
Bart Kiers
18
Nur als Hinweis: Wenn Sie dies tun, damit Sie den Inhalt eines anderen auf Ihrer eigenen Website präsentieren können, tun Sie dies nicht .
Ceejayoz
Ich stimme Ceejayoz zu. Dies klingt sehr danach, als würden Sie versuchen, Inhalte zu verwenden, auf die Sie nicht wirklich Zugriff haben, und Sie versuchen, Verweise auf den ursprünglichen Autor zu entfernen. Das wäre nicht sehr schön ...
selfawaresoup
2
Alternative großartige Lösung stackoverflow.com/a/9315908/1518921 :)
Guilherme Nascimento
1
Es ist tatsächlich üblich, solche Dinge aus legitimen Gründen zu tun, wenn Sie mit Inhalten arbeiten, die von einem CMS generiert wurden. Der Grund dafür ist, dass Sie sich nie mit dem eigentlichen Code herumschlagen möchten, der ein solches Snippet erstellt, weil Sie Ihre Updates beschädigen werden. Also lässt du es sein Ding machen, dann machst du dein Ding.
Nosajimiki

Antworten:

291
$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 dem Deliminator zum ersten Mal begegnen.

Austin Fitzpatrick
quelle
11
Was ist mit "nur tun, wenn" von "existiert?
Alisso
3
Du hast recht. strpos gibt FALSE zurück, wenn "By" nicht gefunden wird. substr gibt eine leere Zeichenfolge zurück, wenn die angegebene Länge false ist. In der Praxis wäre es wahrscheinlich nützlich, zu überprüfen, ob "By" vorhanden ist, und dies dann nur dann zu tun, wenn dies der Fall ist (andernfalls wird nur die Zeichenfolge in Ruhe gelassen).
Austin Fitzpatrick
13
Dies funktioniert: strpos ($ variable, "By")? substr ($ variable, 0, strpos ($ variable, "By")): $ variable;
Noah Gary
Ich stelle eine Antwort, die meiner Meinung nach alles unten anspricht, und erkläre auch Möglichkeiten, mit allen möglichen Dingen umzugehen, z. B. Groß- und Kleinschreibung beachten, mehrfache Vorkommen und reguläre Ausdrücke. Wenn jemand etwas flexibler machen möchte oder keine Kontrolle über die eingehenden Eingaben hat, lohnt es sich wahrscheinlich, dies zu überprüfen.
Azoundria
1
Funktioniert perfekt für mich @Goahnary!
Denis
106

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

$s = 'Posted On April 6th By Some Dude';
echo strstr($s, 'By', true);
VolkerK
quelle
4
Danke, das ist heutzutage die richtige Antwort !
Matmarbon
59
Beachten Sie, dass es zurückgegeben wird, FALSEwenn ein Teil der Zeichenfolge nicht gefunden wird. Die Lösung könnte also sein:echo strstr($s, 'By', true) ?: $s;
Kenorb
6
^^^ Kenorbs Antwort sollte heute die akzeptierte Antwort sein. Eine andere Alternative wäre explode(' By', $s)[0]IMHO von squarecandy
Zack Morris
In der Tat ist die Existenzprüfung von Kenorb der richtige Weg, obwohl es nicht erforderlich ist, die Zeichenfolge zu testen.
BarryMode
Nur hier, um zu sagen, @ Kenorb Methode ist die Titten.
Quinn Comendant
32

Wie wäre es mit explode:

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

Vorteile:

squarecandy
quelle
@bkac - Was ist los mit altmodisch, solange es funktioniert und nicht abgeschrieben wird?
Squarecandy
3
Dadurch entfällt die zusätzliche Überprüfung auf das Vorhandensein der Trennzeichenfolge, die für die akzeptierte Antwort erforderlich ist.
David Cullen
17

Du könntest es tun:

$posted = preg_replace('/ By.*/', '', $posted);
echo $posted;
JYelton
quelle
4
+1 Es ist das einzige, das funktioniert, wenn die Steuerzeichen NICHT vorhanden sind (im Gegensatz zu den anderen, die eine leere Zeichenfolge zurückgeben, wenn die Steuerzeichen nicht in der Quellzeichenfolge vorhanden sind)
Tom Auger
9

Eine Methode wäre:

$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th
HADI
quelle
Dies ist die beste Antwort, die funktioniert, auch wenn By nicht in der Zeichenfolge enthalten ist. Die Substr-Antwort ist falsch, da sie nicht vorhanden ist und fehlschlägt.
Neoteknic
Dies ist falsch: Die Funktion wird nicht durch By, sondern durch ein Zeichen im 2. Parameter aufgeteilt. Das heißt, es wird entweder Boder geteilt y. Technisch gesehen bekommt es nicht alles vor einem By.
MSB
Seien Sie vorsichtig: strtok gibt den Teil der Zeichenfolge nach dem Zeichen zurück, wenn es das erste Zeichen in der Zeichenfolge ist, z. B. strtok('a:b', ':')wird zurückgegeben, aaber strtok(':b', ':')zurückgegeben b, keine leere Zeichenfolge, wie Sie es erwarten würden.
Quinn Comendant
5

Austins Antwort funktioniert für Ihren Beispielfall.

Im Allgemeinen sollten Sie sich die Funktionen für reguläre Ausdrücke ansehen, wenn sich die Teilzeichenfolge, auf die Sie aufteilen, zwischen den Zeichenfolgen unterscheiden kann:

$ variable = preg_replace ('/ By. * /', '', $ variable);
jemfinch
quelle
+1, das ist richtig. Wenn Sie auch "Autor:" oder "Geschrieben von:" oder "Mit Zustimmung von:" teilen möchten, ist es wahrscheinlich am einfachsten, einen regulären Ausdruck zu erstellen. Wenn ich jedoch keine Regex-Logik mache, neige ich dazu, sie zu vermeiden, da sie dem Code (zumindest für mich) sofort eine gewisse Komplexität zu verleihen scheinen
Austin Fitzpatrick
5

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

Verwendung:

<?php
    //returns Apples
    $clean_string= strip_after_string ("Apples, Oranges, Banannas",",");
?>
Tim Yobson
quelle
Sie sollten die Funktion strip_after_string besser benennen als sas und eine Codebasis voller kryptischer Initialismen haben. Dies ist jedoch meine am besten lesbare Antwort auf diese Frage.
Anther
4

Sie können verwenden listund explodeFunktionen:

list($result) = explode("By", "Posted On April 6th By Some Dude", 2);
// $result is "Posted On April 6th "
Salman A.
quelle
Dies ist die genaueste. Wie ich wünschte, ich könnte zweimal dafür stimmen
John Max
4
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));
Tim Cooper
quelle
2

preg_replace bietet einen Weg:

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

Mit regulären Ausdrücken: $string = preg_replace('/\s+By.*$/', '', $string)

Ming-Tang
quelle
Bitte fügen Sie dieser Nur-Code-Antwort eine Erklärung bei.
Mickmackusa
2

Im Folgenden finden Sie 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 der Meinung sind, dass By möglicherweise mehr als einmal vorhanden ist und nach dem letzten Auftreten alles ausschneiden möchte, verwenden Sie strrpos .

Im Folgenden finden Sie eine weniger effiziente Methode, die jedoch weniger Codeplatz beansprucht. Diese Methode ist auch flexibler und ermöglicht es Ihnen, jeden regulären Ausdruck zu verwenden.

$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 Modifikator i wie folgt hinzu:

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

Um alles über den letzten bekommen von , wenn Sie denken , es könnte mehr sein als ein, fügen Sie ein extra * am Anfang so.:

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

Aber hier ist auch eine wirklich mächtige Möglichkeit, mit preg_match das zu tun, was Sie vielleicht 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 zunächst verwirrend erscheinen, aber sie können sehr mächtig und Ihr bester Freund sein, wenn Sie sie beherrschen! Viel Glück!

Azoundria
quelle
1

Warum...

Dies ist wahrscheinlich übertrieben 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 darin angesprochenen Artikeln wurden drei für meine Bedürfnisse benötigt. Mit einer engen Klammerung und dem Löschen der Kommentare könnte dies bei nur 13 Codezeilen noch lesbar bleiben.

Dies betrifft Folgendes:

  • Auswirkungen der Verwendung von REGEX auf die Leistung im Vergleich zu strrpos / strstr / strripos / stristr.
  • Verwenden von strripos / strrpos, wenn Zeichen / Zeichenfolge nicht in Zeichenfolge gefunden werden.
  • Entfernen von der linken oder rechten Seite der Zeichenfolge (erstes oder letztes Vorkommen).
  • CaSe Empfindlichkeit.
  • Sie möchten die Möglichkeit haben, die ursprüngliche Zeichenfolge unverändert zurückzugeben, wenn das Suchzeichen / die Zeichenfolge nicht gefunden wurde.

Verwendung:

Senden Sie die ursprüngliche Zeichenfolge, suchen Sie nach Zeichen / Zeichenfolge, "R" / "L" für den Start auf der rechten oder linken Seite, wahr / falsch für die Groß- und Kleinschreibung. Suchen Sie beispielsweise nach "hier" ohne Berücksichtigung der Groß- und Kleinschreibung. Beginnen Sie in der Zeichenfolge rechts.

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 Folgendes ausgegeben: "Now".

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
    }           

}
Robert Mauro
quelle
Wenn Sie meine Arbeitsantwort ablehnen, würden wir uns freuen, wenn Sie angeben, warum.
Robert Mauro
0

Verwenden Sie die strstr- Funktion.

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

echo $result ;

Der dritte Parameter trueweist die Funktion an, alles vor dem ersten Auftreten des zweiten Parameters zurückzugeben.

Faisal
quelle
1
strtok($str, 'By')sieht einfacher aus
mu3
-2
$variable = substr($initial, 0, strpos($initial, "By"));

if (!empty($variable)) { echo $variable; } else { echo $initial; }
valente
quelle