Regex fehlersuche

hallo,
ich benötige für ein preg_replace ein regex.

[code]

linktext

[/code]

soll in

gesplittet werden.
die tags sind immer die gleichen, der text ist immer anders.

bisher habe ich das versucht:

Was soll das bedeuten, „in

splitten“?
Willst du wirklich splitten, oder etwas ersetzen?

Die Qualität deiner Problembeschreibung lässt wieder mal stark zu wünschen übrig.
Kannst du nicht bitte endlich mal anfangen, dir etwas mehr Mühe zu geben, deine Probleme auch für Außenstehende nachvollziehbar beschreiben …?

ich habe einen quellcode-ausschnitt und will daraus mit preg_replace textstellen nach dem muster:[code]

linktext

[/code]

mit

ersetzen.


Um ma eben RegEx's zu bauen ist sowas ganz nett: [regexpal.com/](http://regexpal.com/)

Um ma eben RegEx’s zu bauen ist sowas ganz nett: regexpal.com/

[quote=“lenz”]bisher habe ich das versucht:

  • dein Beispieltext enthält nicht nur genau ein Zeichen, das kein " ist hinter dem http:// des Links
  • dein Beispieltext endet nicht mit , sondern mit

[quote=“chrisb”][quote=“lenz”]bisher habe ich das versucht:

  • dein Beispieltext enthält nicht nur genau ein Zeichen, das kein " ist hinter dem http:// des Links
    - dein Beispieltext endet nicht mit , sondern mit

    [/quote]Rot = stimmt net :wink:
    Wie dem auch sei… im Nutzen hatte sein RegEx dennoch weitere Fehler die mit “meinem” hoffentlich ausgemerzt sind [size=85](bin mir beim target net sicher… auch könnte man das escapen vom Bindestrich eventuell lassen bzw. muss beim face den Bindestrich ans Ende setzen. Würde ich ihn dort net escapen spuckt mir der Regex Tester nen Fehler aus :smiley:)[/size]

Ärgert dich das nicht langsam selber, dass du beim Widersprechen so oft falsch liegst …?

[quote=“lenz”]

[…]linktext


[color=#FF0000][whitespace]

[/color][/quote][quote="lenz"]$var = preg_replace('%

[...][color=#0000FF][\s]*

[/color][color=#FF0000][\s]*[/color]%', '

', $var);[/quote] Das [color=#0000FF]blau markierte[/color] des Suchausdrucks würde auf das [color=#0000FF]blau markierte[/color] des Beispieltextes matchen.

Damit der Gesamtausdruck matched, muss aber auch noch das rot markierte im Ausdruck auf das rot markierte im Beispieltext matchen.
Tut es aber nicht, weil

nicht

ist.

Ärgert dich das nicht langsam selber, dass du beim Widersprechen so oft falsch liegst …?[/quote]Ansichtssache oder? :ps:
Hatte übersehen das in seinem RegEx noch der Absatz und das 2. mit eingeschlossen sind [size=85](da ich unter anderem nur aufs

am Ende geachtet hatte… nachdem der 1. Fehler klar war und ich sah wie der RegEx geschrieben war, entschied ich mich fürs selbst machen, interpretierte aber leider seine Problembeschreibung+Beispiel falsch^^ Nichts-desto-trotz hätte ich besser hinsehen sollen :ps:)[/size]

Dann wäre mein RegEx natürlich noch um\s+<p>zu ergänzen, wobei ich noch immer nicht den Sinn verstehe… bzw. das wieso/weshalb/warum^^

PS: hast Beispiele fürs „so oft“? An 2-3x meine ich mich sogar iwie zu erinnern [size=85](inkl. jetzt)[/size]

Für sowas braucht man kein Regex… Regex ist auch viel zu langsam dafür, weil der Rechenaufwand mit der Länge exponenziell ansteigt.

Wenn es nicht nur der Text sein sollte, sondern auch noch die Attributwerte der Tags, die variabel sind - dann halte ich Regex schon für angebracht.

So lang ist der Suchausdruck nun auch wieder nicht.

Außerdem ist „Regex sind langsam“ ein häufiges Vorurteil, das in vielen Fällen einer objektiven Betrachtung nicht stand hält.
Ich hatte schon diverse Diskussion in anderen Foren, in denen beim Benchmarken die Regex sogar als Sieger hervorgingen, vor anderen Lösungen mit Stringfunktionen o.ä.

Grundsätzlich hast du Recht - man kann das hier auch ohne Regex lösen*, selbst mit mehreren variablen Bestandteilen. Aber gerade letztere sorgen ab einem bestimmten Punkt doch wieder dafür, dass man sich Regex-Flexibilität selber „nachbaut“, nur mit anderen Methoden und unter Aufwand, der der Erstellung eines passenden Suchmusters auch nicht mehr nachsteht - und damit ist dann auch nicht viel gewonnen.

  • Bspw. wenn das unterstrichene hier

[quote][u]

linktext[u]

[/u][/quote] immer gleich ist und alles, was auf dieses „Muster“ passt, ersetzt werden soll - Position des ersten Teils suchen, Position des zweiten Teils suchen, entsprechend der Positionen ausschneiden. Aber dann brauchst du auch noch eine Schleife, wenn mehrere solche Stellen ersetzt werden sollen, musst ggf. nach einer Ersetzung den Offset für die nächste Suche wieder entsprechend zurücksetzen, etc. Abgesehen vom Aufwand, den man da rein stecken muss, endest du damit auch mit einem wesentlich längeren Stück Code, was ein umfangreicheres Script auch nicht übersichtlicher macht.

[quote=„chrisb“][]
Abgesehen vom Aufwand, den man da rein stecken muss, endest du damit auch mit einem wesentlich längeren Stück Code, was ein umfangreicheres Script auch nicht übersichtlicher macht.[/quote]Nicht zu vergessen das wir nicht von C++ sondern von PHP reden :wink:
Die Regular Expressions werden direkt als Maschinencode ausgeführt und sind daher deutlich schneller als was man in PHP selbst schreiben könnte. [size=85](bzw. die Engine ist in Maschinencode. Da diese für diese Aufgabe geschaffen wurde, nur dies kann und auch der Syntax auf die eine Aufgabe angepasst ist [size=85](daher „klein“ ist)[/size], ists eben schneller)[/size]

Wie gesagt… bei ner richtigen/direkten Sprache wie ASM,C–,C,C++,D und eventuell noch Java [size=85](von der Tatsache her das man mit Java wohl genauso schnell wie in C sein kann, theoretisch bzw. annähernd. Zumindest soweit ichs gelesen hab :smiley: Mögen tu ich Java dennoch net :wink:)[/size]
Bei PHP,Javascript,Python,C# etc. sind RegEx’s durchaus angemessen. Man muss dennoch immer wissen was man tut und wie es am besten ist :wink:

PS: das Interpretationssprachen lahm sind, ist u.a. meine Meinung anhand meiner Erfahrung… wie sehr das stimmt bzw. wie genau meine Meinung in Bezug auf die Realität wirklich stimmt kann ich schlecht sagen… meine Erfahrungen beziehen sich u.a. auf meine Programmieranfänge mit PHP wo ich Scripte schrieb die viele loops hatten etc, dort wo man normalerweise fertige PHP Funktionen nutzt :smiley:
Als ich dann mit C++ anfing stellte ich fest, das ich das was ich in PHP schrieb, sogar schreiben muss weil Programme/Computer so funktionieren. Was also in PHP lahm war, war in C++ plötzlich Standard und nicht umgehbar.
Da es jedoch meine Anfänge waren, kann ich nicht sagen was genau ich getan hatte etc. Würde ich meinen alten Code sehen würd ich vermutlich eh das kotzen kriegen :ps:

Glaubst du das PHP auf dem Prozessor nicht als Maschinencode ausgeführt wird? Außerdem kann man nur schwer vorhersehen, was wirklich schneller ist… aber ich hab grad einen Benchmark gemacht und RegEx war tatsächlich schneller als PHP und strpos (vermutlich weil PHP einfach nur schlecht ist und String-Operationen unnötig aufwändig sind).

Java wird entweder JIT compiliert, als Bytecode oder direkt als Maschinencode compiliert (wobei letzteres die JavaVM nicht mehr benötigt und daher wohl am schnellsten ist).
Allerdings ist keine dieser Implementationen “schneller” als C, da vor allem der Code selbst die Geschwindigkeit definiert (wobei das OOP-Modell von Java wirklich merkbar Ressourcen kostet).

Hier läufts ein wenig über den Fred hinaus ^^

Wie heißt es doch so schön in den guidelines für Android Entwickler?
"Don’t use objects!"
Bringt mich immer wieder zum grinsen. Nagut auf mobilen Endgeräten ist natürlich alles etwas ärger aber zeigt schon, dass Objekte in Java recht … groß sind.
Und dass PHP nicht der schnellste mit Strings ist wissen wir ja.
Was wollte ich eigentlich sagen? Ach keine Ahnung … postcounter++

[quote=“Morpheus”]Wie heißt es doch so schön in den guidelines für Android Entwickler?
“Don’t use objects!”[/quote]

Quelle? Mich würde ehrlich interessieren wo das steht.

http://developer.android.com/videos/index.html#v=M1ZBjlCRfz0
Müsste in Google I/O 2010 - Android UI design patterns gewesen sein. Vllt auch eines der anderen.