2012-03-31 8 views
1

Ich habe mehrere Funktionen ausprobiert, um was auch immer zwischen zwei Strings zu extrahieren. Die Delimiter könnten Sonderzeichen enthalten, ich denke, deshalb hat keiner für mich funktioniert.Der zuverlässigste Weg, Strings zwischen zwei Delimitern zu extrahieren

Meine aktuelle Funktion:

function between($str, $startTag, $endTag){ 
    $delimiter = '#'; 
    $regex = $delimiter . preg_quote($startTag, $delimiter) 
         . '(.*?)' 
         . preg_quote($endTag, $delimiter) 
         . $delimiter 
         . 's'; 
    preg_match($regex, $str, $matches); 
    return $matches; 
} 

Beispiel string:

#{[email protected]}# 
Text i want 
#{END}# 

#{[email protected]}# 
Second text i want 
#{END}# 

Wie das verbessern oder eine andere Lösung vorschlagen zu:

  • Unterstützung jeder Art von Charakter oder neue Linien
  • Extrahieren Sie mehrere Zeichenfolgen, falls gefunden

Aktuelles Verhalten: gibt nur das erste Spiel und gibt auch das Spiel und die umliegenden Tags, die

unerwünscht ist

Antwort

6

Verwenden Sie die m Option für mehrzeilige regulären Ausdrücken (es das ermöglicht . Zeichen Zeilenumbrüche übereinstimmen):

preg_match('/foo.+bar/m', $str); 
//     ^--- this 

Verwenden preg_match_all() auf Ihre mehrere Strings zu erhalten:

preg_match_all($regex, $str, $matches); 
return $matches[1]; // an array of the strings 

Edit:

Der Grund, warum Ihr aktueller Code die Übereinstimmung plus t zurückgibt Die umgebenden Tags sind, weil Sie return $matches verwenden. Das Array enthält mehrere Elemente. Index 0 ist immer die gesamte Zeichenfolge, die dem Ausdruck entspricht. Indizes 1 und höher sind Ihre Erfassungsgruppen. In Ihrem Ausdruck hatten Sie nur eine Erfassungsgruppe (die "Zeichenkette"), also hätten Sie nur return $matches[1] statt return $matches machen wollen.

0

Sie preg_match_all verwenden können mehrere Zeichenfolgen zu extrahieren, außer, dass Ihre Code scheint einfach genug, normalerweise einfacher ist schneller.

Verwandte Themen