Ich suche nach einem regulären Ausdruck!

  • Ersteller birdseedmusic
  • Erstellt am
birdseedmusic

birdseedmusic

Administrator
Registriert
13.04.02
Beiträge
7.294
Reaktionen
1.544
Punkte
25.527
Hi!

Also wer nicht weiss was ein regulärer Ausdruck ist, ab besten gar nicht erst durchlesen...

Ich bastel gerade an einem regulären Ausdruck für homerecording.de (unter php, aber die sind ja wohl sprachübergreifend gleich), um dort bestimmte Wörter aus Postings herauszufiltern, welche im Glossar vorkommen, und die automatisch mit den Links zum jeweiligen Glossareintrag zu verbinden. Der erste Versuch lief schief. Momentan hab ich folgendes:

$value = eregi_replace('([^]a-zA-Z0-9])('.$assoc['nom'].')([^[a-zA-Z0-9])','\\1\ . '\]\\2\[/url\]\\3',$value);

($assoc['...'] sind lediglich die Datenbankfelder aus der Glossartabelle..)

Heißt: ein POSIX Ausdruck, der Wörter herausfiltert. Wörter ist für mich alles, was nicht zwischen Buchstaben steht. Dann wird ein String drum rumgepackt. Problem: Damit zerschieß ich auch automatisch alle Links, in denen das Wort zufällig drin vorkommt. Und mit der Methode, dass vor dem Wort keine geschlossenen eckigen Klammern stehen sollen und dahinter keine offenen, funzt auch nur halb. Weil dann Sachen wie:

{url=http://www.blabla.de/myDomain}Der [url=homerecording.de/modules/glossaire/glossaire-comm.php?sid=32]MIDI
Sequencer{/url} trotzdem zerschossen werden. Hast jemand ne Idee, wie man das Problem lösen könnte?

gruss
MK[/url]
 
Hmmm, schwierig, ich weiß nicht, ob das mit regulären Ausdrücken so einfach in einem Schritt machbar ist. Ein alternativer Lösungsvorschlag von mir wäre:

Den zu durchsuchenden Text in Nicht-Links und Links zu unterteilen und diese Teile nacheinander in ein Array zu speichern. Dann die Arrayelemente mit der Ersetzfunktion durchlaufen, die kein Link sind. Anschließend aus dem Array wieder den Text zusammenbauen.

Ich weiß halt leider nicht, ob das von der Performance so gut ist, müsstest du austesten.

L.G., GrooveT.

P.S.: Ich schau mal, ob ich da auf was draufkomme, interessiert mich auch tierisch.
 
Hallo deathmachine,

Danke für deinen Vorschlag. Leider verursacht er einen Fehler:

Warning: REG_BADRPT in (....)/class.forumposts.php on line 125

Meintest du mit XXX eigentlich eine geöffnete SPITZE oder ECKIGE Klammer ?

Problem ist ja, dass sowohl Links in HTML Form (spitze klammer A HREF ist gleich h t t p : / / ....) als auch in Xoops Form (eckige Klammer auf ... url = h t t p : / / w w w . blablabla . d e eckicke Klammer zu....) zulässig sind. Man müßte also beides abfangen.

gruss
MK


gruss
MK
 
hi deathmachine,

Leider klappt das immer noch nicht. Die Klammer muss irgendwie vor das Komma, sonst meckert der php Parser. Aber die Fehlermeldung ist immer noch die Gleiche.

Bin dazu übergegangen, die Glossareinträge in der form [ g = 1 2 3 ] M e i n W o r t [ / g ] zu setzen und dann erst bei der Anzeige als Links parsen zu lassen. So bin ich flexibler, was Verlinkung angeht. Performancemäßig ist das kein größeres Problem.

Momentane Variante (immer noch obige Fehlermeldung:)

$value = eregi_replace('((?<!\[.\])[a-zA-Z0-9])('.$assoc['nom'].')([a-zA-Z0-9](?!\[/.\])))', '\\1\[g=' . $assoc['id'] . '\]\\2\[/g\]\\3', $value);

gruss
MK[/g]
 
Ich hab das jetzt mal selbst probiert und bekomme keine Fehlermeldung. Dafür tut's aber nicht das was es soll... :-?

Ich werd mal weiter rumtüfteln zwischendurch!

Was ich mich die ganze Zeit schon frage: Wieso eigentlich Posix und nicht Perl? Soweit ich weiß ist doch ein Perl-Regex bis zu 200 mal schneller.
 
Tadaaa! :-D

Ich glaub ich hab's jetzt, allerdings als Perl-Regex. Testen kannst Du das dann HIER!

Sämtliche Vorkommen des Wortes "Test" werden durch den gewünschten Code ersetzt, außer wenn sie innerhalb der URL-Tags vorkommen. Funktioniert jetzt erst mal nur für den Board-Code und nicht für HTML, aber das sollte sich wohl auch noch bewerkstelligen lassen.

Ich hab eben mal einige verschiedene Möglichkeiten durchprobiert, kam immer das gewünschte Ergebnis. ;-)
 
Kurzer Nachtrag: Das Problem mit dem HTML-Code kann man natürlich auch von vornerein vermeiden indem man im Text zuvor schon alle HTML-Links durch [ u r l = ***]...[/ u r l] ersetzen lässt, so daß gar kein "a href=***" mehr vorkommt.
 
Hallo,

ich dränge mich nur ungern in Fachgespräche :-D Reguläre Ausdrücke sind mir bekannt; allerdings allgemein im Kontext von Automaten.
Was mir auffällt ist folgendes:
Gebt mal in Box meines Vorgängers das Wort "Haltestelle" ein - fällt was auf? :-D
Ggf muß also noch sichergestellt sein, daß dieses Wort von Lehrzeichen eingeschlossen wird - zusammengesetzte Worte können also nicht gefiltert werden, da keine Semantikerkennung möglich. Richtig?

Viel Erfolg weiterhin und viele Grüße,
Ulrich
 
Öhm....tja...:-D Danke für den Tip!

Wusste ich zwar schon, aber ich dachte eigentlich das macht nix, aber bei genauerem Studium das Glossars hier auf der Seite ist mir grad mal aufgefallen, daß dann zum Beispiel auch der Begriff "Halle" als "Hall" gewertet wird und dann den entsprechenden Link verpasst bekommt. Ich guck grad mal ob ich das noch ändern kann... ;-)
 
Ich habe eine andere Lösung: ersetze doch einfach die Begriffe mit str_replace.

Du speicherst zunächst in einem Array die Begriffe und den dazugehörigen URL unter einer festen ID.
Nun liest Du den Datenbank-String aus und lässt diesen String in einzelne Elemente eines neuen Arrays aufteilen (explode("\n",$string)).
Dann mit foreach() die Elemente bzw. Begriffe (=Text) ersetzen, falls eine Übereinstimmung da ist.
Als Letztes nur noch die Elemente zu einem String zusammenfügen (mit implode()).
 
swipe70 schrieb:
Ich habe eine andere Lösung: ersetze doch einfach die Begriffe mit str_replace.
...

Ist zwar vom Prinzip her einfach machbar, aber dann werden immer noch die Zeichenketten ersetzt, die sich irgendwo zwischen [u r l] und [/u r l] befinden, was ja nicht sein darf, da sonst verschachtelte HTML-Tags entstehen. ;-) Außerdem ist die Methode reichlich rechenintensiv und belegt Unmengen an wertvollem Speicher.
 
Naja, verschachtelte HTML-Tags sind eigentlich kein Problem. Es kann zwar zu Inkompatibilitäten kommen (z.B. bei spezifischer Setzung von Schriftformatierung), aber wenn man die Lösung gut umsetzt, ist das kein Problem :)

Außerdem ist die Methode reichlich rechenintensiv und belegt Unmengen an wertvollem Speicher.

Hmm ... stimmt. Wobei man die Methode von mir doch besser realisieren kann (den DB-String über eine for-Schleife mit der Ersetzung der Begriffe laufen lassen).
 
swipe70 schrieb:
Naja, verschachtelte HTML-Tags sind eigentlich kein Problem. Es kann zwar zu Inkompatibilitäten kommen (z.B. bei spezifischer Setzung von Schriftformatierung), aber wenn man die Lösung gut umsetzt, ist das kein Problem :)

Ok, zeig mir den Browser der mir einen Link noch korrekt anzeigt wenn PHP in den HTML-Code des selbigen noch einen Link reinsetzt...:-D
 
Hi Todesmaschine,

Ja cool. Ich wusste gar nicht, dass das das mit Perl-Regex möglich ist, komm irgendwie bei RegExp immer ins Schleudern. Die Lösung funzt bis auf das Problem mit den zusammengesetzten Wörtern schon gut. Ich werd es gleichmal weiter testen :)

Das mit den str_replace hatt ich selber schon, aber dann schnell aufgegeben. Klappt nicht wegen dem Link-in-Link Problem. Performancemäßig kann man tatsächlich 120 mal (für jeden Eintrag) nen Regulären Ausdruck auf das Posting niederprasseln lassen, ohne dass die Einbußen wirklich wild wären.

EDIT: Hey deatchmachine, langsam peil ich das..ein bedingter Ausdruck...du bist genial, mein Junge! Weiter so. Wär ich nie drauf gekommen. Kleines Problem noch: Tags in der Art [ g = 1 2 3 ] t e s t [ / g ] werden nochmal gefüllt, aber ich glaube mit deinem Ansatz wäre das dann irgendwie lösbar (aber wie??) :)

gruss
Mk
 
So, jetzt hab ich's! ;-)

Guckst Du hier!

Nimmt nur einzeln stehende Worte, dürfte so eigentlich verwendbar sein.

Krieg ich jetzt'n Eis? :-D
 
birdseedmusic schrieb:
Kleines Problem noch: Tags in der Art [ g = 1 2 3 ] t e s t [ / g ] werden nochmal gefüllt, aber ich glaube mit deinem Ansatz wäre das dann irgendwie lösbar (aber wie??) :)

Wieso sollte das ein Problem darstellen? Das läuft doch normalerweise nur einmal durch und dann ist der Link drin...oder sollte das bei Zitatantworten dann zu unerwünschten Ergebnissen führen wenn das [ g ] da drin vorkommt? Scheint so...außerdem ist mir grad noch aufgefallen daß die neue Version Worte wie "Soundkarten-Test" mit einem Link belegen würde weil der Bindestrich wie ein Leerzeichen eingestuft wird. Macht das was oder kann man das so lassen?

Ich bastel mal noch kurz was... ;-)
 
Neue Version!

Keine Verschachtelung mehr zwischen [ g = *] und [ / g ]. Sämtliche anderen Tags die ausgenommen werden sollen kannst Du ja in der ersten Klammer nach dem selben Schema einsetzen wenn nötig.
 
Hi Deathmachine,

Danke für deinen Tipp. Ich werde das Ganze gleich mal hardcoremäßig testen:

Ich hätte gerne eine neue Soundkarte mit [g=77]VST[/g]-Plugins und [g=1]Arpeggiator[/g] für Steffi, die das Ganze aus dem [g=38]ff[/g] beherrscht. Ich möchte gerne [g=94]Feedback[/g] haben, und zwar für meine Mucke, die Ihr unter <A HREF="
">toller MP3 MIDI Sequencer Sound</A> herunterladen könnt.

Ihr könnt auch den anderen Link benutzen:

Soundkarten MP3 Test

So mal schauen was dabei herauskommt.

gruss
MK
 

Ähnliche Themen

Saurus
Antworten
227
Aufrufe
15K
sixstringwarrior
sixstringwarrior

Oft gelesene Themen

Zurück
Oben