![]() |
[PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Hallo. Folgende Situation: ich habe einen Text mit Autoren- und URL-Infos, der wie folgt aussieht
Zitat:
Wie müsste der reguläre Ausdruck zum Filtern aussehen? :gruebel: Sicher irgendwie
Code:
Den Inhalt des <a>-Tags habe ich als (.*?) angegeben, damit ich ihn später für die Konvertierung nutzen kann (aus dem Link soll ein simples <span>Inhalt</span> werden). Bessere Ideen sind gern willkommen.
/\<a ??? href=\"NA\" ???\>(.*?)\<\/a\>/
Und die Fragezeichen sind mein eigentliches Problem. Sie stehen für die Leerzeichen oder anderen Attribute, die sich vor und/oder hinter dem "href"-Attribut befinden könnten. Hat da jemand eine Idee? |
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Moin,
ich würde es so machen:
Code:
edit: mit dem fixen NA dann so:
/<a [^>]*?href=["\'].*?["\'][^>]*?>(.*?)<\/a>/
Code:
/<a [^>]*?href=["\']NA["\'][^>]*?>(.*?)<\/a>/
|
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Zitat:
Code:
wäre meine idee dazu.....
/\<a.+href=\"NA\".*\>(.*)\<\/a\>/Ui
|
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Ich bin etwas verwirrt. Die Ausdrücke scheinen zu stimmen. Wenn ich einen Hyperlink als String fake, dann klappt es. Aber meine Vorgabe klappt irgendwie nicht? Was könnte die Ursache sein? Zeichensatz? Andere Probleme? Wenn ich mit "htmlspecialchars" den String im Browser anzeigen lasse, sehe ich nichts ungewöhnliches. :gruebel:
|
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Zitat:
|
DP-Maintenance
Dieses Thema wurde von "r_kerber" von "Klatsch und Tratsch" nach "Internet / LAN / ASP.NET" verschoben.
Ich denke das ist dort besser aufgehoben. |
DP-Maintenance
Dieses Thema wurde von "Christian Seehase" von "Internet / LAN / ASP.NET" nach "Programmieren allgemein" verschoben.
Kein Delphi-Thema |
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Wie in der o.g. Vorlage. Die Platzhalter, etwa %author%, werden durch K2 durch die entsprechenden Angaben ersetzt. So wird bspw. ein
Zitat:
Zitat:
|
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Also wenn ich das teste funktioniert es mit meiner o.g. Expression. Ich tippe eher auf einen Fehler im System. Vielleicht sind die Links zu dem Zeitpunkt, zu dem du matchen willst noch garnicht generiert?
Oder ein Fehler im PHP-Code? Dass es an der Ausgabe an sich liegt kann ich mir kaum vorstellen... |
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Da liegst du nicht falsch. Wie gesagt, mit einem Fake-String funktionierte es ja auch. Ich bin der Ursache auf die Spur gekommen. Ich hatte angenommen, K2 würde den String dynamisch erzeugen. Aber Nein, er wird in der Datenbank gespeichert und sieht im Dump so aus
Zitat:
Code:
Ich habe jetzt erst das "stripslashes" drüber gejagt und dann erfolgreich per "preg_replace" den, in dem Fall unerwünschten Hyperlink entfernt:
$style_info = get_option('k2styleinfo');
echo stripslashes($style_info);
Code:
Voilà, Problem gelöst.
$style_info = get_option('k2styleinfo');
$style_info = stripslashes($style_info); $pattern = '/<a [^>]*?href=["\']NA["\'][^>]*?>(.*?)<\/a>/'; $afterPattern = "<span style=\"font-weight:bold\">\\1</span>"; $style_info = preg_replace($pattern, $afterPattern, $style_info); echo "$style_info"; Danke. |
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Ähnliche Frage, darum möchte ich ungern einen neuen Beitrag schreiben. Wenn ich jetzt mehrere Links oder andere HTML-Elemente filtern möchte, dann klappt das wunderbar, solange sich die Elemente nicht wiederholen. Dieses Beispiel:
Code:
könnte ich quasi "zerlegen", wenn ich nach "a" und "div" filtere. Kommt am Schluss aber noch ein "a" dazu
[url="bla"]Huhu[/url] <div>Was auch immer</div>
Code:
dazu, dann findet mein Ausdruck leider nur noch den kompletten String vom ersten <a bis zum letzten a>. Kann ich das irgendwie vermeiden, so dass nur die einzelnen Elemente gefunden werden?
[url="bla"]Huhu[/url] <div>Was auch immer</div> <a>ding</a>
Ich habe vergessen zu erwähnen, dass die Elemente nach bestimmten Namen gefiltert werden. Eine allgemeine Anfrage, die nur nach der HTML-Syntax geht, reicht hier nicht. |
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
klar...
Code:
sollte alle elemente einzeln filtern... bei nested tags wird das ganze allerdings nicht mehr hinhauen, also sowas wie
<[^>]*?>(.*?)<\/[^>].*?>
Code:
aber das war ja nicht das problem oder?
<div><div></div></div>
alle links bekommst du mit
Code:
edit: ich verstehe dein edit nicht ganz :gruebel:
<a[^>]*?>(.*?)<\/a>
|
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Mein Edit bedeutet, dass ich eben nicht pauschal nach allen HTML-Tags suchen kann/will, sondern es werden nur bestimmte gebraucht. Der erste reguläre Ausdruck ist also nicht das, was ich suche.
Und ich habe im Moment das Problem mit "nested tags", auch wenn es nicht mal die selben sind. Wie gesagt:
Code:
findet bei mir momentan noch den kompletten String, weil er ja mit einem <a>-Tag anfängt und auch aufhört. Der reguläre Ausdruck soll also die drei einzelnen Elemente erkennen. Das ist mein Problem.
<a>ding</a> <h1>dong</h1> <a>blupp</a>
|
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Schalte mal über den Parameter U auf nicht gierig um.
Gruss Thorsten |
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Habe ich schon. Es spielt doch keine Rolle, dass es sich um "konvertierte" HTML-Tags handelt? Also die spitze Klammer < ist im Code <. Ich meine, ob ich nun die spitze Klammer angebe oder den konvertierten String sollte doch unerheblich sein.
|
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Zitat:
|
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Mache ich es so, würde es gehen:
Code:
Ich möchte ja nicht, dass zwischen den Tags noch mal eine spitze Klammer aufgeht. Von daher dachte ich an obige Lösung. Gut so? Bessere Ideen?
<a[^>]*?>(.[color=red][^<][/color]*[color=red][^<][/color]?)<\/a>
|
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Hallo,
Code:
liefert bei mir folgendes...
preg_match_all(
'/<(.*)>(.*)<\/(.*)>/U', '<a>ding</a> <h1>dong</h1> <a>blupp</a>', $match );
Code:
Array
( [0] => Array ( [0] => <a>ding</a> [1] => <h1>dong</h1> [2] => <a>blupp</a> ) [1] => Array ( [0] => a [1] => h1 [2] => a ) [2] => Array ( [0] => ding [1] => dong [2] => blupp ) [3] => Array ( [0] => a [1] => h1 [2] => a ) ) Gruss Thorsten |
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
Hm, ich will nicht ausschließen, dass ich irgendwo einen Fehler gemacht habe. Ich stehe mit den regulären Ausdrücken ein wenig auf Kriegsfuß. :cry: Egal. Zurzeit ist mein WordPress-Plugin fertig. Ich denke zwar, dass es so was schon geben wird, aber ich wollte es mal selbst programmieren: eine Suchfunktion für fremde Seiten. :stupid: Ähnlich wie das [dp]-Suchtag, sozusagen. Bisher laufen <google>, <heise> und <wikipedia>. Die werden direkt im Texteditor eingegeben und müssen dann natürlich als <google> usw. geparst.
Ich werde morgen lokal (auf meinem Ubuntu) mal einen ausgedehnten Bug-Versuch starten und diverse Suchtags nacheinander auflisten und gucken, ob es irgendwann in irgendeiner Kombination ein Problem gibt. :lol: |
Re: [PHP] Regulärer Ausdruck zum Filtern eines Hyperlinks
:lol: Ich hab's gewusst. In meiner Anfrage
Code:
war noch ein Fehler. So klappten zwar die Einzelaufrufe à la
"#<".$searchEngines[$i]["name"]."(=(.*?))?>(.*[^<*]?)<\/".$searchEngines[$i]["name"].">#Usi"
Code:
ohne Probleme, aber sobald ich die erweiterte Syntax nutzen wollte
<heise>Vista</heise> <google>Delphi</google> <heise>Counterstrike</heise>
Code:
hat er die zwei <heise>-Tags zusammengefasst. Jetzt habe ich in der Anfrage das Fragezeichen weggelassen:
<heise=MacOS>Vista</heise> <google>Test</google> <heise>WordPress</heise>
Code:
und siehe da, jetzt klappt es. :stupid: Augenscheinlich.
"#<".$searchEngines[$i]["name"]."(=(.*[color=red][b][s]?[/s][/b][/color]))?>(.*[^<*]?)<\/".$searchEngines[$i]["name"].">#Usi"
|
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:
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:
<google>irgendwas</google>
Code:
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
string pattern = string.Format
(@"<((?<tag>{0})(=(.*))?)>(.*[^<*]?)<\/(\k<tag>)>", searchEngines);
Code:
werden anstandslos gefunden. Kommt am Schluss aber noch ein Google dazu:
<google>bla</google> <heise>text</heise>
Code:
findet der String nur das erste und letzte "google" und nimmt alles dazwischen als Text. Wieso? :gruebel:
<google>bla</google> <heise>text</heise> <google>foo</google>
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 < und >, so wie in der Suchanfrage gezeigt. |
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:
Das Problem war der greedy *-Operator zwischen den Tags ("(.*[^<*]?").
<(?<tag>google)(=(.*))?>(.*?)</(\k<tag>)>
|
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:
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:
<suchmaschine>Suchbegriff(e)</suchmaschine>
<suchmaschine=Suchbegriff(e)>Text für Beitrag</suchmaschine> Zitat:
Zitat:
Edit: So geht es (?)
Code:
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...
@"<((?<tag>{0})(=(.*?))?)>(.*?)<\/(\k<tag>)>"
|
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:
Matcht
<(?<tag>suchmaschine)(=.*?)?>(.*?)</(\k<tag>)>
Code:
jedenfalls anstandslos. Und entspricht ja dann auch fast deiner Version ;) .
<suchmaschine>Suchbegriff(e)</suchmaschine>
<suchmaschine=Suchbegriff(e)>Text für Beitrag</suchmaschine> <suchmaschine>Suchbegriff(e)</suchmaschine> |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:31 Uhr. |
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