Wie bekomme ich einen Teilstring zwischen zwei Strings in PHP?

142

Ich benötige eine Funktion, die den Teilstring zwischen zwei Wörtern (oder zwei Zeichen) zurückgibt. Ich frage mich, ob es eine PHP-Funktion gibt, die das erreicht. Ich möchte nicht über Regex nachdenken (nun, ich könnte einen machen, denke aber wirklich nicht, dass dies der beste Weg ist). Denken strposund substrFunktionen. Hier ist ein Beispiel:

$string = "foo I wanna a cake foo";

Wir rufen die Funktion auf: $substring = getInnerSubstring($string,"foo");
Sie gibt zurück: "Ich möchte einen Kuchen".

Danke im Voraus.

Update: Nun, bis jetzt kann ich nur einen Teilstring zwischen zwei Wörtern in nur einer Zeichenfolge erhalten. Erlauben Sie mir, mich etwas weiter gehen zu lassen und zu fragen, ob ich die Verwendung von erweitern kann getInnerSubstring($str,$delim), um Zeichenfolgen zu erhalten, die zwischen dem Begrenzungswert liegen. Beispiel:

$string =" foo I like php foo, but foo I also like asp foo, foo I feel hero  foo";

Ich bekomme ein Array wie {"I like php", "I also like asp", "I feel hero"}.

Nadjib Mami
quelle
2
Wenn Sie Laravel bereits verwenden, \Illuminate\Support\Str::between('This is my name', 'This', 'name');ist dies praktisch. laravel.com/docs/7.x/helpers#method-str-between
Ryan

Antworten:

324

Wenn die Zeichenfolgen unterschiedlich sind (z. B. [foo] & [/ foo]), schauen Sie sich diesen Beitrag von Justin Cook an. Ich kopiere seinen Code unten:

function get_string_between($string, $start, $end){
    $string = ' ' . $string;
    $ini = strpos($string, $start);
    if ($ini == 0) return '';
    $ini += strlen($start);
    $len = strpos($string, $end, $ini) - $ini;
    return substr($string, $ini, $len);
}

$fullstring = 'this is my [tag]dog[/tag]';
$parsed = get_string_between($fullstring, '[tag]', '[/tag]');

echo $parsed; // (result = dog)
Alejandro García Iglesias
quelle
7
Diese Funktion wurde so geändert, dass Start und Ende eingeschlossen sind. <code> function string_between ($ string, $ start, $ end, $ inclusive = false) {$ string = "". $ string; $ ini = strpos ($ string, $ start); if ($ ini == 0) return ""; if (! $ inclusive) $ ini + = strlen ($ start); $ len = strpos ($ string, $ end, $ ini) - $ ini; if ($ inclusive) $ len + = strlen ($ end); return substr ($ string, $ ini, $ len); } </ code>
Henry
2
Ist es möglich, diese Funktion so zu erweitern, dass zwei Zeichenfolgen zurückgegeben werden können? Angenommen, ich habe einen $ fullstring von "[tag] Hunden [/ tag] und [tag] Katzen [/ tag]" und ich möchte ein Array zurück, das "Hunde" und "Katzen" enthält.
Leonard Schuetz
1
@LeonardSchuetz - Versuchen Sie diese Antwort dann.
Leymannx
"[tag] Hunde [/ tag] und [tag] Katzen [/ tag]" wird immer noch nicht beantwortet. Wie bekomme ich "Hunde" und "Katzen" in Array-Form? Bitte beraten.
Romnick Susa
1
Jemand hat meine Frage beantwortet! Sie können diese stackoverflow.com/questions/35168463/…
Romnick Susa
78

Reguläre Ausdrücke sind der richtige Weg:

$str = 'before-str-after';
if (preg_match('/before-(.*?)-after/', $str, $match) == 1) {
    echo $match[1];
}

onlinePhp

nkkollaw
quelle
1
Das war perfekt. Danke dir!
Kyle K
Es funktioniert super! Und für Leute, die nicht an regEx gewöhnt sind, fügen Sie einfach "\" hinzu, um Sonderzeichen zu vermeiden
JCarlosR
22
function getBetween($string, $start = "", $end = ""){
    if (strpos($string, $start)) { // required if $start not exist in $string
        $startCharCount = strpos($string, $start) + strlen($start);
        $firstSubStr = substr($string, $startCharCount, strlen($string));
        $endCharCount = strpos($firstSubStr, $end);
        if ($endCharCount == 0) {
            $endCharCount = strlen($firstSubStr);
        }
        return substr($firstSubStr, 0, $endCharCount);
    } else {
        return '';
    }
}

Beispielverwendung:

echo getBetween("abc","a","c"); // returns: 'b'

echo getBetween("hello","h","o"); // returns: 'ell'

echo getBetween("World","a","r"); // returns: ''
Daniel
quelle
5
Übrigens ist Ihr Absatz "Beispielverwendung" falsch. Die Argumente sind völlig falsch.
That-Ben
15
function getInnerSubstring($string,$delim){
    // "foo a foo" becomes: array(""," a ","")
    $string = explode($delim, $string, 3); // also, we only need 2 items at most
    // we check whether the 2nd is set and return it, otherwise we return an empty string
    return isset($string[1]) ? $string[1] : '';
}

Anwendungsbeispiel:

var_dump(getInnerSubstring('foo Hello world foo','foo'));
// prints: string(13) " Hello world "

Wenn Sie umgebende Leerzeichen entfernen möchten, verwenden Sie trim. Beispiel:

var_dump(trim(getInnerSubstring('foo Hello world foo','foo')));
// prints: string(11) "Hello world"
Christian
quelle
1
Dies ist ordentlich, weil es ein Einzeiler ist, aber leider ist es auf ein eindeutiges Trennzeichen beschränkt, dh wenn Sie die Teilzeichenfolge zwischen "foo" und "bar" benötigen, müssen Sie eine andere Strategie verwenden.
Mastazi
13
function getInbetweenStrings($start, $end, $str){
    $matches = array();
    $regex = "/$start([a-zA-Z0-9_]*)$end/";
    preg_match_all($regex, $str, $matches);
    return $matches[1];
}

Zum Beispiel möchten Sie das Array von Zeichenfolgen (Schlüsseln) zwischen @@ im folgenden Beispiel, wobei '/' nicht dazwischen liegt

$str = "C://@@ad_custom_attr1@@/@@upn@@/@@samaccountname@@";
$str_arr = getInbetweenStrings('@@', '@@', $str);

print_r($str_arr);
Ravi Verma
quelle
3
Vergessen Sie nicht, "/" wie "\ /" zu maskieren, wenn es sich um eine $ start- oder $ end-Variable handelt.
Luboš Remplík
10

benutze die strstr php Funktion zweimal.

$value = "This is a great day to be alive";
$value = strstr($value, "is"); //gets all text from needle on
$value = strstr($value, "be", true); //gets all text before needle
echo $value;

Ausgänge: "is a great day to"

Bryce
quelle
8

Ich mag die Lösungen für reguläre Ausdrücke, aber keine der anderen passt zu mir.

Wenn Sie wissen, dass es nur 1 Ergebnis geben wird, können Sie Folgendes verwenden:

$between = preg_replace('/(.*)BEFORE(.*)AFTER(.*)/sm', '\2', $string);

Ändern Sie VOR und NACH den gewünschten Trennzeichen.

Beachten Sie auch, dass diese Funktion den gesamten String zurückgibt, falls nichts übereinstimmt.

Diese Lösung ist mehrzeilig, aber Sie können je nach Bedarf mit den Modifikatoren spielen.

Ragnar
quelle
7

Kein PHP-Profi. Aber ich bin kürzlich auch gegen diese Wand gelaufen und das habe ich mir ausgedacht.

function tag_contents($string, $tag_open, $tag_close){
   foreach (explode($tag_open, $string) as $key => $value) {
       if(strpos($value, $tag_close) !== FALSE){
            $result[] = substr($value, 0, strpos($value, $tag_close));;
       }
   }
   return $result;
}

$string = "i love cute animals, like [animal]cat[/animal],
           [animal]dog[/animal] and [animal]panda[/animal]!!!";

echo "<pre>";
print_r(tag_contents($string , "[animal]" , "[/animal]"));
echo "</pre>";

//result
Array
(
    [0] => cat
    [1] => dog
    [2] => panda
)
Light93
quelle
6

Wenn Sie fooals Trennzeichen verwenden, schauen Sie sich anexplode()

obligatorisch
quelle
Ja, wir können das gewünschte Ergebnis erzielen, indem wir den 1. Index des explodierten Arrays verwenden. (nicht die Null).
Kapitän_a
6
<?php
  function getBetween($content,$start,$end){
    $r = explode($start, $content);
    if (isset($r[1])){
        $r = explode($end, $r[1]);
        return $r[0];
    }
    return '';
  }
?>

Beispiel:

<?php 
  $content = "Try to find the guy in the middle with this function!";
  $start = "Try to find ";
  $end = " with this function!";
  $output = getBetween($content,$start,$end);
  echo $output;
?>

Dies wird "den Kerl in der Mitte" zurückgeben.

Asif Rahman
quelle
3

Wenn Sie mehrere Wiederholungen aus einer einzelnen Zeichenfolge haben und unterschiedliche [Start] - und [\ End] -Muster haben. Hier ist eine Funktion, die ein Array ausgibt.

function get_string_between($string, $start, $end){
    $split_string       = explode($end,$string);
    foreach($split_string as $data) {
         $str_pos       = strpos($data,$start);
         $last_pos      = strlen($data);
         $capture_len   = $last_pos - $str_pos;
         $return[]      = substr($data,$str_pos+1,$capture_len);
    }
    return $return;
}
noelthegreat
quelle
3

Hier ist eine Funktion

function getInnerSubstring($string, $boundstring, $trimit=false) {
    $res = false;
    $bstart = strpos($string, $boundstring);
    if ($bstart >= 0) {
        $bend = strrpos($string, $boundstring);
        if ($bend >= 0 && $bend > $bstart)
            $res = substr($string, $bstart+strlen($boundstring), $bend-$bstart-strlen($boundstring));
    }
    return $trimit ? trim($res) : $res;
}

Verwenden Sie es wie

$string = "foo I wanna a cake foo";
$substring = getInnerSubstring($string, "foo");

echo $substring;

Ausgabe (beachten Sie, dass Leerzeichen vor und am und Ihrer Zeichenfolge zurückgegeben werden, falls vorhanden)

Ich will einen Kuchen

Wenn Sie das Ergebnis trimmen möchten, verwenden Sie die Funktion wie

$substring = getInnerSubstring($string, "foo", true);

Ergebnis : Diese Funktion gibt false zurück, wenn sie $boundstringnicht gefunden wurde $stringoder $boundstringnur einmal vorhanden $stringist. Andernfalls wird die Teilzeichenfolge zwischen dem ersten und dem letzten Auftreten von $boundstringin zurückgegeben $string.


Verweise

Wh1T3h4Ck5
quelle
Sie verwenden eine if-Klausel ohne Klammern, wissen aber wahrscheinlich, dass dies eine schlechte Idee ist?
Xmoex
@xmoex, über welche IFKlausel sprichst du? Vielleicht habe ich einen Tippfehler gemacht, aber um ehrlich zu sein, kann ich momentan nichts Seltsames sehen. Beide IFs, die ich in der obigen Funktion verwendet habe, haben die richtigen Umgebungsbedingungen in Klammern. Erstens IFhaben Sie auch geschweifte Klammern (Klammern), die den 2-Zeilen-Block umgeben, IFzweitens brauchen Sie sie nicht, weil es sich um einen einzeiligen Code handelt. Was fehlt mir?
Wh1T3h4Ck5
Ich spreche von der einzelnen Zeile. Ich dachte, der Herausgeber Ihres Beitrags hat ihn gelöscht, aber dann habe ich gesehen, dass er überhaupt nicht da war. Imvho ist dies eine häufige Quelle für manchmal schwer zu findende Fehler, wenn Sie den Code in Zukunft ändern.
Xmoex
@xmoex Stimme überhaupt nicht zu. Nach fast 20 Jahren im Geschäft kann ich sagen, dass Zahnspangen eine äußerst seltene Ursache für Fehler sind (eine ordnungsgemäße Einrückung ist sowieso erforderlich). Das Umgeben einer einzelnen Zeile mit geschweiften Klammern ist hässlich (Ansichtssache) und vergrößert den Code (Tatsache). In den meisten Unternehmen ist es erforderlich, unnötige Klammern bei der Code-Vervollständigung zu entfernen. Es ist zwar schwierig, beim Debuggen für unerfahrene Benutzer etwas zu erkennen, aber das ist kein globales Problem, sondern nur ein Schritt auf ihrem Lernpfad. Ich persönlich hatte nie große Probleme mit Zahnspangen, selbst bei komplexen Verschachtelungen.
Wh1T3h4Ck5
@ Wh1T3h4Ck5 Ich respektiere Ihre Meinung und Ihre Erfahrungen, bin aber überhaupt nicht überzeugt. Klammern vergrößern den Code aus Systemsicht nicht. Es vergrößert die Dateigröße, aber was kümmert der Compiler? Und wenn Sie js verwenden, werden Sie wahrscheinlich automatisch hässlichen Code, bevor Sie live gehen. Ich denke, die Verwendung von Zahnspangen tut immer weniger weh, als sie "manchmal" wegzulassen ...
xmoex
3

Verbesserung von Alejandros Antwort . Sie können die Argumente $startoder $endleer lassen und es wird der Anfang oder das Ende der Zeichenfolge verwendet.

echo get_string_between("Hello my name is bob", "my", ""); //output: " name is bob"

private function get_string_between($string, $start, $end){ // Get
    if($start != ''){ //If $start is empty, use start of the string
        $string = ' ' . $string;
        $ini = strpos($string, $start);
        if ($ini == 0) return '';
        $ini += strlen($start);
    }
    else{
        $ini = 0;
    }

    if ($end == '') { //If $end is blank, use end of string
        return substr($string, $ini);
    }
    else{
        $len = strpos($string, $end, $ini) - $ini; //Work out length of string
        return substr($string, $ini, $len);
    }
}
Rikki Masters
quelle
1

Verwenden:

<?php

$str = "...server daemon started with pid=6849 (parent=6848).";
$from = "pid=";
$to = "(";

echo getStringBetween($str,$from,$to);

function getStringBetween($str,$from,$to)
{
    $sub = substr($str, strpos($str,$from)+strlen($from),strlen($str));
    return substr($sub,0,strpos($sub,$to));
}

?>
MaxEcho
quelle
1

Ein bisschen verbesserter Code von GarciaWebDev und Henry Wang. Wenn $ start oder $ end leer angegeben ist, gibt die Funktion Werte vom Anfang oder bis zum Ende des $ -Strings zurück. Es ist auch die Option "Inklusive" verfügbar, unabhängig davon, ob das Suchergebnis eingeschlossen werden soll oder nicht:

function get_string_between ($string, $start, $end, $inclusive = false){
    $string = " ".$string;

    if ($start == "") { $ini = 0; }
    else { $ini = strpos($string, $start); }

    if ($end == "") { $len = strlen($string); }
    else { $len = strpos($string, $end, $ini) - $ini;}

    if (!$inclusive) { $ini += strlen($start); }
    else { $len += strlen($end); }

    return substr($string, $ini, $len);
}
Julius Tilvikas
quelle
1

Ich muss dem Beitrag von Julius Tilvikas etwas hinzufügen. Ich habe nach einer Lösung wie dieser gesucht, die er in seinem Beitrag beschrieben hat. Aber ich denke, es gibt einen Fehler. Ich bekomme nicht wirklich die Zeichenfolge zwischen zwei Zeichenfolgen, ich bekomme auch mehr mit dieser Lösung, weil ich die Länge der Startzeichenfolge subtrahieren muss. Wenn ich das mache, bekomme ich wirklich den String zwischen zwei Strings.

Hier sind meine Änderungen seiner Lösung:

function get_string_between ($string, $start, $end, $inclusive = false){
    $string = " ".$string;

    if ($start == "") { $ini = 0; }
    else { $ini = strpos($string, $start); }

    if ($end == "") { $len = strlen($string); }
    else { $len = strpos($string, $end, $ini) - $ini - strlen($start);}

    if (!$inclusive) { $ini += strlen($start); }
    else { $len += strlen($end); }

    return substr($string, $ini, $len);
}

Greetz

V.

Der_V
quelle
1

Versuchen Sie dies, seine Arbeit für mich, erhalten Sie Daten zwischen Testwort .

$str = "Xdata test HD01 test 1data";  
$result = explode('test',$str);   
print_r($result);
echo $result[1];
Dave
quelle
1

Im PHP- strposStil wird dies zurückgegeben, falsewenn die Start- smoder Endmarke emnicht gefunden wird.

Dieses Ergebnis ( false) unterscheidet sich von einer leeren Zeichenfolge, die Sie erhalten, wenn zwischen der Start- und der Endmarke nichts steht.

function between( $str, $sm, $em )
{
    $s = strpos( $str, $sm );
    if( $s === false ) return false;
    $s += strlen( $sm );
    $e = strpos( $str, $em, $s );
    if( $e === false ) return false;
    return substr( $str, $s, $e - $s );
}

Die Funktion gibt nur die erste Übereinstimmung zurück.

Es ist offensichtlich, aber erwähnenswert, dass die Funktion zuerst sucht smund dann sucht em.

Dies bedeutet, dass Sie möglicherweise nicht das gewünschte Ergebnis / Verhalten erhalten, wenn emzuerst gesucht werden muss und dann die Zeichenfolge auf der Suche nach rückwärts analysiert werden muss sm.

Paolo
quelle
1

Dies ist die Funktion, die ich dafür benutze. Ich habe zwei Antworten in einer Funktion für einzelne oder mehrere Trennzeichen kombiniert.

function getStringBetweenDelimiters($p_string, $p_from, $p_to, $p_multiple=false){
    //checking for valid main string  
    if (strlen($p_string) > 0) {
        //checking for multiple strings 
        if ($p_multiple) {
            // getting list of results by end delimiter
            $result_list = explode($p_to, $p_string);
            //looping through result list array 
            foreach ( $result_list AS $rlkey => $rlrow) {
                // getting result start position
                $result_start_pos   = strpos($rlrow, $p_from);
                // calculating result length
                $result_len         =  strlen($rlrow) - $result_start_pos;

                // return only valid rows
                if ($result_start_pos > 0) {
                    // cleanying result string + removing $p_from text from result
                    $result[] =   substr($rlrow, $result_start_pos + strlen($p_from), $result_len);                 
                }// end if 
            } // end foreach 

        // if single string
        } else {
            // result start point + removing $p_from text from result
            $result_start_pos   = strpos($p_string, $p_from) + strlen($p_from);
            // lenght of result string
            $result_length      = strpos($p_string, $p_to, $result_start_pos);
            // cleaning result string
            $result             = substr($p_string, $result_start_pos+1, $result_length );
        } // end if else 
    // if empty main string
    } else {
        $result = false;
    } // end if else 

    return $result;


} // end func. get string between

Zur einfachen Verwendung (gibt zwei zurück):

$result = getStringBetweenDelimiters(" one two three ", 'one', 'three');

Um jede Zeile in einer Tabelle zum Ergebnisarray zu bringen:

$result = getStringBetweenDelimiters($table, '<tr>', '</tr>', true);
Szekelygobe
quelle
1

ich benutze

if (count(explode("<TAG>", $input))>1){
      $content = explode("</TAG>",explode("<TAG>", $input)[1])[0];
}else{
      $content = "";
}

Ersetzen Sie <TAG> durch das gewünschte Trennzeichen.

Ángel RG
quelle
1

eine bearbeitete Version dessen, was Alejandro García Iglesias gesagt hat.

Auf diese Weise können Sie eine bestimmte Position der Zeichenfolge auswählen, die Sie abrufen möchten, basierend darauf, wie oft das Ergebnis gefunden wird.

function get_string_between_pos($string, $start, $end, $pos){
    $cPos = 0;
    $ini = 0;
    $result = '';
    for($i = 0; $i < $pos; $i++){
      $ini = strpos($string, $start, $cPos);
      if ($ini == 0) return '';
      $ini += strlen($start);
      $len = strpos($string, $end, $ini) - $ini;
      $result = substr($string, $ini, $len);
      $cPos = $ini + $len;
    }
    return $result;
  }

Verwendung:

$text = 'string has start test 1 end and start test 2 end and start test 3 end to print';

//get $result = "test 1"
$result = $this->get_string_between_pos($text, 'start', 'end', 1);

//get $result = "test 2"
$result = $this->get_string_between_pos($text, 'start', 'end', 2);

//get $result = "test 3"
$result = $this->get_string_between_pos($text, 'start', 'end', 3);

strpos verfügt über eine zusätzliche optionale Eingabe, um die Suche an einem bestimmten Punkt zu starten. Daher speichere ich die vorherige Position in $ cPos. Wenn die for-Schleife erneut überprüft wird, beginnt sie am Ende der Stelle, an der sie aufgehört hat.

SwiftNinjaPro
quelle
1

Die überwiegende Mehrheit der Antworten hier beantwortet den bearbeiteten Teil nicht, ich denke, sie wurden zuvor hinzugefügt. Es kann mit Regex gemacht werden, wie eine Antwort erwähnt. Ich hatte einen anderen Ansatz.


Diese Funktion durchsucht $ string und findet die erste Zeichenfolge zwischen $ start- und $ end-Zeichenfolgen, beginnend an der $ offset-Position. Anschließend wird die $ offset-Position aktualisiert, um auf den Anfang des Ergebnisses zu zeigen. Wenn $ includeDelimiters true ist, werden die Trennzeichen in das Ergebnis aufgenommen.

Wenn die Zeichenfolge $ start oder $ end nicht gefunden wird, wird null zurückgegeben. Es wird auch null zurückgegeben, wenn $ string, $ start oder $ end eine leere Zeichenfolge sind.

function str_between(string $string, string $start, string $end, bool $includeDelimiters = false, int &$offset = 0): ?string
{
    if ($string === '' || $start === '' || $end === '') return null;

    $startLength = strlen($start);
    $endLength = strlen($end);

    $startPos = strpos($string, $start, $offset);
    if ($startPos === false) return null;

    $endPos = strpos($string, $end, $startPos + $startLength);
    if ($endPos === false) return null;

    $length = $endPos - $startPos + ($includeDelimiters ? $endLength : -$startLength);
    if (!$length) return '';

    $offset = $startPos + ($includeDelimiters ? 0 : $startLength);

    $result = substr($string, $offset, $length);

    return ($result !== false ? $result : null);
}

Die folgende Funktion findet alle Zeichenfolgen, die zwischen zwei Zeichenfolgen liegen (keine Überlappungen). Es erfordert die vorherige Funktion und die Argumente sind dieselben. Nach der Ausführung zeigt $ offset auf den Anfang der zuletzt gefundenen Ergebniszeichenfolge.

function str_between_all(string $string, string $start, string $end, bool $includeDelimiters = false, int &$offset = 0): ?array
{
    $strings = [];
    $length = strlen($string);

    while ($offset < $length)
    {
        $found = str_between($string, $start, $end, $includeDelimiters, $offset);
        if ($found === null) break;

        $strings[] = $found;
        $offset += strlen($includeDelimiters ? $found : $start . $found . $end); // move offset to the end of the newfound string
    }

    return $strings;
}

Beispiele:

str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar')gibt [' 1 ', ' 3 '].

str_between_all('foo 1 bar 2', 'foo', 'bar')gibt [' 1 '].

str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo')gibt [' 1 ', ' 3 '].

str_between_all('foo 1 bar', 'foo', 'foo')gibt [].

Quirinus
quelle
0

Verwenden:

function getdatabetween($string, $start, $end){
    $sp = strpos($string, $start)+strlen($start);
    $ep = strpos($string, $end)-strlen($start);
    $data = trim(substr($string, $sp, $ep));
    return trim($data);
}
$dt = "Find string between two strings in PHP";
echo getdatabetween($dt, 'Find', 'in PHP');
Pankaj Raturi
quelle
0

Ich hatte einige Probleme mit der hier verwendeten Funktion get_string_between (). Also kam ich mit meiner eigenen Version. Vielleicht könnte es Menschen im selben Fall wie mir helfen.

protected function string_between($string, $start, $end, $inclusive = false) { 
   $fragments = explode($start, $string, 2);
   if (isset($fragments[1])) {
      $fragments = explode($end, $fragments[1], 2);
      if ($inclusive) {
         return $start.$fragments[0].$end;
      } else {
         return $fragments[0];
      }
   }
   return false;
}
KmeCnin
quelle
0

schrieb diese vor einiger Zeit, fand es sehr nützlich für eine breite Palette von Anwendungen.

<?php

// substr_getbykeys() - Returns everything in a source string that exists between the first occurance of each of the two key substrings
//          - only returns first match, and can be used in loops to iterate through large datasets
//          - arg 1 is the first substring to look for
//          - arg 2 is the second substring to look for
//          - arg 3 is the source string the search is performed on.
//          - arg 4 is boolean and allows you to determine if returned result should include the search keys.
//          - arg 5 is boolean and can be used to determine whether search should be case-sensative or not.
//

function substr_getbykeys($key1, $key2, $source, $returnkeys, $casematters) {
    if ($casematters === true) {
        $start = strpos($source, $key1);
        $end = strpos($source, $key2);
    } else {
        $start = stripos($source, $key1);
        $end = stripos($source, $key2);
    }
    if ($start === false || $end === false) { return false; }
    if ($start > $end) {
        $temp = $start;
        $start = $end;
        $end = $temp;
    }
    if ( $returnkeys === true) {
        $length = ($end + strlen($key2)) - $start;
    } else {
        $start = $start + strlen($key1);
        $length = $end - $start;
    }
    return substr($source, $start, $length);
}

// substr_delbykeys() - Returns a copy of source string with everything between the first occurance of both key substrings removed
//          - only returns first match, and can be used in loops to iterate through large datasets
//          - arg 1 is the first key substring to look for
//          - arg 2 is the second key substring to look for
//          - arg 3 is the source string the search is performed on.
//          - arg 4 is boolean and allows you to determine if returned result should include the search keys.
//          - arg 5 is boolean and can be used to determine whether search should be case-sensative or not.
//

function substr_delbykeys($key1, $key2, $source, $returnkeys, $casematters) {
    if ($casematters === true) {
        $start = strpos($source, $key1);
        $end = strpos($source, $key2);
    } else {
        $start = stripos($source, $key1);
        $end = stripos($source, $key2);
    }
    if ($start === false || $end === false) { return false; }
    if ($start > $end) {
        $temp = $start; 
        $start = $end;
        $end = $temp;
    }
    if ( $returnkeys === true) {
        $start = $start + strlen($key1);
        $length = $end - $start;
    } else {
        $length = ($end + strlen($key2)) - $start;  
    }
    return substr_replace($source, '', $start, $length);
}
?>
Dave
quelle
0

Mit einigem Fehler fangen. Insbesondere erfordern die meisten der vorgestellten Funktionen, dass $ end vorhanden ist, obwohl es in meinem Fall tatsächlich optional sein musste. Verwenden Sie dies, wenn $ end optional ist, und bewerten Sie FALSE, wenn $ start überhaupt nicht vorhanden ist:

function get_string_between( $string, $start, $end ){
    $string = " " . $string;
    $start_ini = strpos( $string, $start );
    $end = strpos( $string, $end, $start+1 );
    if ($start && $end) {
        return substr( $string, $start_ini + strlen($start), strlen( $string )-( $start_ini + $end ) );
    } elseif ( $start && !$end ) {
        return substr( $string, $start_ini + strlen($start) );
    } else {
        return FALSE;
    }

}
NotaGuruAtAll
quelle
0

Die UTF-8-Version der Antwort von @Alejandro Iglesias funktioniert für nicht-lateinische Zeichen:

function get_string_between($string, $start, $end){
    $string = ' ' . $string;
    $ini = mb_strpos($string, $start, 0, 'UTF-8');
    if ($ini == 0) return '';
    $ini += mb_strlen($start, 'UTF-8');
    $len = mb_strpos($string, $end, $ini, 'UTF-8') - $ini;
    return mb_substr($string, $ini, $len, 'UTF-8');
}

$fullstring = 'this is my [tag]dog[/tag]';
$parsed = get_string_between($fullstring, '[tag]', '[/tag]');

echo $parsed; // (result = dog)
NXT
quelle
0

Ich habe die beste Lösung dafür von tonyspiro bekommen

function getBetween($content,$start,$end){
   $r = explode($start, $content);
   if (isset($r[1])){
       $r = explode($end, $r[1]);
       return $r[0];
   }
   return '';
}
So M
quelle
0

Mit dieser kleinen Funktion ist dies ganz einfach möglich:

function getString($string, $from, $to) {
    $str = explode($from, $string);
    $str = explode($to, $str[1]);
    return $s[0];
}
$myString = "<html>Some code</html>";
print getString($myString, '<html>', '</html>');

// Prints: Some code
Bosnischer Codierer
quelle
-1

Ich benutze dies seit Jahren und es funktioniert gut. Könnte wohl effizienter gemacht werden, aber

Grabstring ("Teststring", "", "", 0) gibt
Teststring zurück. Grabstring ("Teststring", "Test", "", 0) gibt String-
Grabstring ("Teststring", "s", "", zurück) 5) gibt einen String zurück

function grabstring($strSource,$strPre,$strPost,$StartAt) {
if(@strpos($strSource,$strPre)===FALSE && $strPre!=""){
    return("");
}
@$Startpoint=strpos($strSource,$strPre,$StartAt)+strlen($strPre);
if($strPost == "") {
    $EndPoint = strlen($strSource);
} else {
    if(strpos($strSource,$strPost,$Startpoint)===FALSE){
        $EndPoint= strlen($strSource);
    } else {
        $EndPoint = strpos($strSource,$strPost,$Startpoint);
    }
}
if($strPre == "") {
    $Startpoint = 0;
}
if($EndPoint - $Startpoint < 1) {
    return "";
} else {
        return substr($strSource, $Startpoint, $EndPoint - $Startpoint);
}

}}

Carbroker
quelle