[PHP]stringBetween Funktion

02/09/2014 17:41 Requi#1
Ich brauchte eine Funktion, die in einem String zwischen 2 angegeben Zeichenfolgen, den Text rausbekommt.
Da ich RegEx nicht so mag, habe ich kurz eine Funktion dafür geschrieben:

PHP Code:
function stringBetween($content$strStart$strEnd) {
    
$lenStart strlen($strStart);
    
$strResult "";
    
$iPos strpos($content$strStart0);
    
$iEnd strpos($content$strEnd$iPos $lenStart);
    if(
$iPos != false && $iEnd != false) {
        
$strResult substr($content$iPos $lenStart$iEnd - ($iPos $lenStart));
    }
    return 
$strResult;

Nutzung:
PHP Code:
$text "Bäume sind groß";
$mitte stringBetween($text"Bäume""groß");
//$mitte bekommt als Wert "sind" 
Ich hoffe, irgendwem hilft es und ich freue mich auf Verbesserungsvorschläge.

Requi
02/09/2014 18:12 IchVerabschiedeMich#2
How about Regex?

Code:
'/@(.*?)\./s'
Viel einfacher.
02/09/2014 18:28 th0rex#3
Quote:
Originally Posted by Padrio View Post
How about Regex?

Code:
'/@(.*?)\./s'
Viel einfacher.

Quote:
Originally Posted by Requi View Post
Ich brauchte eine Funktion, die in einem String zwischen 2 angegeben Zeichenfolgen, den Text rausbekommt.
Da ich RegEx nicht so mag, habe ich kurz eine Funktion dafür geschrieben:
Er mag kein Regex. Regex ist auch relativ hässlich.(Meine Meinung)
02/10/2014 14:03 dowhile#4
Quote:
Originally Posted by omitma View Post
Er mag kein Regex. Regex ist auch relativ hässlich.(Meine Meinung)
Schließlich ist eine Funktion mit acht Zeilen auch viel schöner als ein Einzeiler der kaum Potential für Fehler bietet (langweiliger).

Und wenn wir schon beim Thema Fehler sind: Gibt "strpos" bei nichtvorkommen nicht "false" statt "-1" zurück?
02/17/2014 15:01 YatoDev#5
Benutz doch den reg exp pattern aus den autoit includes (3.12)
In autoit würde deine func bei einer stringlen von 6350 und einem string der 2100 mal vorkommt ~650 ms brauchen der reg exp pattern ~2 ms.
Deine func wäre für mich sinnvoller wenn alle gefundenen strings returned werden:
stringbetween("123123","1","3") Returned 2 besser wäre alle 2en in einem array
02/17/2014 19:40 Mostey#6
Quote:
Originally Posted by »FlutterShy™ View Post
In autoit würde deine func bei einer stringlen von 6350 und einem string der 2100 mal vorkommt ~650 ms brauchen der reg exp pattern ~2 ms.
Du hast mich überzeugt, diesen Geschwindigkeitsschub kann sich ja keiner entgehen lassen weil man ja einen 6350 char String auch 2100 mal in einem Script abfragen muss. :rolleyes:
02/17/2014 19:48 YatoDev#7
Quote:
Originally Posted by Mostey View Post
Du hast mich überzeugt, diesen Geschwindigkeitsschub kann sich ja keiner entgehen lassen weil man ja einen 6350 char String auch 2100 mal in einem Script aufruft. :rolleyes:
Naja also bei mir kommts schonmal vor das ich eine 10 mb große datei einlese und StringBetween benutze. Außerdem ist schneller immer besser (solang es aufs gleiche ergebnis kommt)
02/17/2014 19:53 Mostey#8
Quote:
Originally Posted by »FlutterShy™ View Post
Naja also bei mir kommts schonmal vor das ich eine 10 mb große datei einlese und StringBetween benutze. Außerdem ist schneller immer besser (solang es aufs gleiche ergebnis kommt)
Verständlichkeit und Lesbarkeit stehen an erster Stelle. Außer natürlich bei der Netzwerkprogrammierung. Da zählt jedes Byte und jede ms.

Dein Beispiel ist nun mal sehr unrealistisch und ich wage einfach mal zu behaupten das die Wahrscheinlichkeit so dermaßen gering ist, einen 6350 char String in einem Script 2100 durchgehen zu müssen. Und selbst wenn, dann dauert es halt mal 500 ms anstatt 2 ms. So lange das ein mal vorkommt ist das kein Thema.
02/17/2014 20:40 YatoDev#9
In dem fall hier ist RegExp aber besser da kannst du auch nichts gegen sagen
02/17/2014 20:50 Mostey#10
Quote:
Originally Posted by »FlutterShy™ View Post
In dem fall hier ist RegExp aber besser da kannst du auch nichts gegen sagen
Das ist kein Argument.
02/18/2014 01:34 MrSm!th#11
Quote:
Originally Posted by Mostey View Post
Verständlichkeit und Lesbarkeit stehen an erster Stelle. Außer natürlich bei der Netzwerkprogrammierung. Da zählt jedes Byte und jede ms.

Dein Beispiel ist nun mal sehr unrealistisch und ich wage einfach mal zu behaupten das die Wahrscheinlichkeit so dermaßen gering ist, einen 6350 char String in einem Script 2100 durchgehen zu müssen. Und selbst wenn, dann dauert es halt mal 500 ms anstatt 2 ms. So lange das ein mal vorkommt ist das kein Thema.
Bitte mach Programmieren niemals zu deinem Beruf oô So eine Denkweise ist schuld an zum Verrecken langsamer Software.
Regex sind wesentlich aussagekräftiger, wenn man sie lesen kann, zudem weniger fehleranfällig und flexibler.
Desweiteren ist das Beispiel gar nicht mal so extrem. Wir reden nochmal, wenn es um ein paar Millionen Zeichen geht..

Quote:
//$mitte bekommt als Wert "sind"
Falsch, da kommt " sind " raus.

@FlutterShy
Nur dass es hier nicht um AutoIt geht.
02/18/2014 06:42 Requi#12
Quote:
Originally Posted by MrSm!th View Post
Falsch, da kommt " sind " raus.
Das dachte ich auch. Aber in php lässt er die Leerzeichen am Anfang und am Ende wohl weg.
02/18/2014 07:54 Mostey#13
Quote:
Originally Posted by MrSm!th View Post
So eine Denkweise ist schuld an zum Verrecken langsamer Software.
Regex sind wesentlich aussagekräftiger, wenn man sie lesen kann, zudem weniger fehleranfällig und flexibler.
Desweiteren ist das Beispiel gar nicht mal so extrem. Wir reden nochmal, wenn es um ein paar Millionen Zeichen geht..
Es geht hier aber sicher nicht um ein paar Millionen Zeichen. Das dürfte ja klar sein das es sich dann um viele Sekunden handelt die das Programm / die Anwendung ausbremsen und sich dann RegEx natürlich mehr rentiert wenn dieser Text sehr oft behandelt werden muss.

Aber wie wäre es, wenn man mal etwas realistischer denkt? Wann hat man schon so eine große Masse zu vergleichen? Hier ist nicht mal ein richtiger Kontext gegeben.

Ob ich jetzt ein mal 500 ms warten muss oder 2ms. So lange es ein mal vorkommt ist es kein Thema. Ich bleibe dabei und muss mir sicher nicht von dir sagen lassen, das ich aufgrund meiner Meinung nicht das tun soll, was ich möchte.
02/18/2014 12:21 IchVerabschiedeMich#14
Quote:
Originally Posted by Mostey View Post
Ob ich jetzt ein mal 500 ms warten muss oder 2ms. So lange es ein mal vorkommt ist es kein Thema. Ich bleibe dabei und muss mir sicher nicht von dir sagen lassen, das ich aufgrund meiner Meinung nicht das tun soll, was ich möchte.
So eine Denkweise ist in meinen Auge einfach falsch.
Wer einmal so etwas durch gehen lässt, der lässt sowas auch an anderen stellen zu.

Dann heißt es: "Ah hier darf die Seite gerne mal 500ms laden, und ah hier auch noch ein mal, und hier stört das ja auch keinen." Und im Endeffekt sind überall stolper fallen das die Seite mal schnell mal langsam ladet.

Und es ist für den Endanwender ein Rießen unterschied ob er mal 2ms oder 500ms warten muss.
02/18/2014 12:42 Mostey#15
Quote:
Originally Posted by Padrio View Post
So eine Denkweise ist in meinen Auge einfach falsch.
Wer einmal so etwas durch gehen lässt, der lässt sowas auch an anderen stellen zu.

Dann heißt es: "Ah hier darf die Seite gerne mal 500ms laden, und ah hier auch noch ein mal, und hier stört das ja auch keinen." Und im Endeffekt sind überall stolper fallen das die Seite mal schnell mal langsam ladet.

Und es ist für den Endanwender ein Rießen unterschied ob er mal 2ms oder 500ms warten muss.
Wer spricht von Ladevorgängen bzw. essentiellen Funktionen die unbedingt nötig sind um eine Seite zu laden?