Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks (https://www.delphipraxis.net/84307-%5Bphp%5D-regulaerer-ausdruck-zum-filtern-eines-hyperlinks.html)

MathiasSimmack 26. Okt 2007 21:39

Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
 
Vorgeschichte: ich nutze ein kleines CSharp-Programm und erstelle damit aus der SQL-Datei meiner Datenbank eine angepasste Version (Umlaute werden konvertiert, Kommentare können ggf weggelassen werden, usw.). Jetzt stecken in der SQL-Textdatei noch meine Suchanfragen à la
Code:
<google>irgendwas</google>
Wenn ich schon mal dabei bin, will ich die gleich mit umwandeln und die HTML-Zeichen < und > durch eckige Klammern ersetzen. Ich habe das Anfragemuster quasi 1:1 aus der PHP-Version übernommen:
Code:
string pattern = string.Format
  (@"&lt;((?<tag>{0})(=(.*))?)&gt;(.*[^&lt;*]?)&lt;\/(\k<tag>)&gt;", searchEngines);
searchEngines ist ein String "google|heise|heisenews|...|thumb". ?<tag> ist eine Gruppierung, die sicherstellen soll, das am Anfang der selbe Tag, etwa "google", steht wie am Schluss. Jetzt tritt das gleiche Problem wieder auf. Diese Tags
Code:
<google>bla</google> <heise>text</heise>
werden anstandslos gefunden. Kommt am Schluss aber noch ein Google dazu:
Code:
<google>bla</google> <heise>text</heise> <google>foo</google>
findet der String nur das erste und letzte "google" und nimmt alles dazwischen als Text. Wieso? :gruebel:


Bevor das Missverständnis kommt: ich habe der Einfachheit halber die spitzen Klammern genommen! In den beiden Beispielen am Schluss meine ich damit die HTML-Zeichen &lt; und &gt;, so wie in der Suchanfrage gezeigt.

Khabarakh 26. Okt 2007 22:51

Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
 
Hab mir nicht die ganzen Beiträge davor durchgelesen, eine vereinfachte Version deines Regexes läuft bei mir jedenfalls durch:
Code:
&lt;(?<tag>google)(=(.*))?&gt;(.*?)&lt;/(\k<tag>)&gt;
Das Problem war der greedy *-Operator zwischen den Tags ("(.*[^&lt;*]?").

MathiasSimmack 27. Okt 2007 07:45

Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
 
Das Ergebnis ändert sich bei mir nicht. Meine Suchtags im Blog arbeiten nach der Syntax
Code:
<suchmaschine>Suchbegriff(e)</suchmaschine>
<suchmaschine=Suchbegriff(e)>Text für Beitrag</suchmaschine>
Also im Prinzip wie das Suchtag in der DP. Hier mal einen kurzen Textauszug aus einem Beitrag. Damit es nicht so blöd aussieht, nehme ich wieder die spitzen Klammern:
Zitat:

<heisenews=90069>Google</heisenews> will mehr über seine Benutzer erfahren, <heisenews=90142>Microsoft</heisenews> ebenfalls ...
usw. Und das wird draus:
Zitat:

[heisenews=90069>Google</heisenews> will mehr über seine Benutzer erfahren, <heisenews=90142]Microsoft[/heisenews] ebenfalls ...
Die PHP-Version erkennt, dass es sich um zwei Suchtags handelt, die CSharp-Version nicht. :gruebel:




Edit: So geht es (?)
Code:
@"&lt;((?<tag>{0})(=(.*?))?)&gt;(.*?)&lt;\/(\k<tag>)&gt;"
Wieso auch immer. Ich bin gerade im Linux und klicke mich durch meine Beiträge durch. Aber der oben zitierte wird völlig korrekt angezeigt. Hm...

Khabarakh 27. Okt 2007 13:32

Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
 
Huppsala, hab es nur mit deinem Beispielproblem ohne Attribute getestet. Im Attributsteil ist ja noch einmal ein greedy Stern, der dann alles bis zum allerletzten ">blablabl</tag>" frisst. Also zwei *?:
Code:
&lt;(?<tag>suchmaschine)(=.*?)?&gt;(.*?)&lt;/(\k<tag>)&gt;
Matcht
Code:
&lt;suchmaschine&gt;Suchbegriff(e)&lt;/suchmaschine&gt;
&lt;suchmaschine=Suchbegriff(e)&gt;Text für Beitrag&lt;/suchmaschine&gt;
&lt;suchmaschine&gt;Suchbegriff(e)&lt;/suchmaschine&gt;
jedenfalls anstandslos. Und entspricht ja dann auch fast deiner Version ;) .


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:13 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz