trans-forum.de.vu

Selbsthilfe von Menschen, die mit Transidentität zu tun haben.
 
  HilfeFAQ    SuchenSuchen     RegistrierenRegistrieren  LoginLogin 

Schon mal drüber nachgedacht?

"Der Frosch, der im Brunnen lebt, beurteilt das Ausmaß des Himmels nach dem Brunnenrand."

mongolisches Sprichwort

Reguläre Ausdrücke

 
 
Schrift vergrößern
Schrift verkleinern
Druck-optimierte Ansicht (stark vereinfachtes Layout)
Autor Nachricht
Nina


 
Beitrag 17.06.2011 17:19     Antworten mit Zitat

Moin,
ihr wisst ja, ich habe vor längerer Zeit mal die Funktion zum Forum hinzugefügt, dass Abkürzungen unterkringelt werden und die Erklärung in einem Tooltip erscheint. Im Allgemeinen funktioniert das ganz gut, aber in seltenen Ausnahmen geht dadurch eine URL kaputt.

:!: Beispiel: http://www.ts-shg-essen.de - daraus wird momentan

Code:

http://www.ts-<acronym title='Selbsthilfegruppe'>shg</acronym>-essen.de

... d.h. "shg" wird hier ersetzt, und so geht der Link kaputt.

Derzeit sieht der Code so aus:

Code:

$message = preg_replace($patterns, $replacements, $message);

... wobei die ersten beiden Argumente jeweils einfache Arrays sind, die vorverarbeitete Paare von Pattern und Replacement enthalten, die für das o.g. Beispiel so aussehen:

Code:

pattern     = #([\s\?\!\-\(\),;>*])(shg)([\s\.\?\!\-\(\),;:&<*])(?!(de|com))#i
replacement = $1<acronym title=\'Selbsthilfegruppe\'>$2</acronym>$3

... d.h. ich filtere bereits etliche "ungünstige" Umgebungen aus.
Dokumentation von preg_replace: http://php.net/manual/de/function.preg-replace.php

:idea: Idee wäre natürlich, das Einfügen des Acronym-Tags nur zu erlauben, wenn es nicht innerhalb einer URL steht. Das sollte sich mit regulären Ausdrücken hinbekommen lassen, oder? Grundsätzlich kenne ich mich damit aus, aber z.B. mit Referenzen und Rückreferenzen hatte ich bisher nur wenig zu tun und stochere etwas im Dunkeln.

:?: Hat jemand eine Idee, die Muster zu verbessern?
beate_r


 
Beitrag 17.06.2011 23:23     Antworten mit Zitat

Nicht allein mit regulären Ausdrücken. Du musst ja tatsächlich abfragen, ob der Kontext innerhalb einer URL steht oder nicht. Das bedeutet, dass Du nicht nur den Zielstring, sondern auch die potentielle URL mit einem regulären Ausdruck matchen musst. Konkreter könntest Du also schauen, ob in dem gleichen Teilstring vor dem Akronym ein http:// enthalten ist und nur wenn das nicht der Fall ist das Akronym zu ersetzen.

Aus Effizienzgründen würde ich so vorgehen: wenn ein Akronymbegriff gefunden wird, würde ich den Teilstring ab dem ersten Whitespace vor dem potentiellen Akronym isolieren und testen, ob das "http://" drin ist, und dann entscheiden.

Dies nur mal als spontane erste Anregung aus dem Bauch heraus. Zum tieferen Einstieg fehlt mir die Zeit.

LG

Beate
_________________
Freiheit bedeutet Verantwortung; das ist der Grund, weshalb die meisten sich vor ihr fürchten
Nina


 
Beitrag 18.06.2011 01:45     Antworten mit Zitat

Hm ja, eine explizite Kontextprüfung wäre der schlimmste Fall. Würde ich nur ungern machen, weil dadurch die Funktion preg_replace ersetzt werden müsste. Hatte gehofft, es sei allein mit RegEx möglich, ein Matching der Form "enthält Pattern && enthält NICHT Antipattern" durchzuführen... :-/

Inzwischen habe ich noch die relativ neue Funktion preg_replace_callback entdeckt, die sich hier vielleicht nutzen lässt -- werde ich mir mal schauen, wenn ich Zeit finde.

2 Stunden später...

Ach verdammt, es lässt mir keine Ruhe. Und hier ist immerhin eine Verbesserung zu vorher:

Code:

(?!.*a>)

... hinten dran bedeutet "trifft nur dann, wenn nicht gefolgt von 'a>' mit beliebigen Zeichen Abstand".
Allerdings eine entsprechende look-behind assertion mit "http://" habe ich bisher nicht geschafft. :shy:

Falls ihr irgendwelche Seiteneffekte hiervon seht, einfach Bescheid sagen.
Jessi


 
Beitrag 26.06.2011 20:44     Antworten mit Zitat

Also, das sind mir hier nun zuviele Termini, gehts vielleicht auch ein wenig verständlicher .? :-P
Nina


 
Beitrag 26.06.2011 23:20     Antworten mit Zitat

Hmmm... joa... nee. Wenn dich PHP interessiert, dann findst im Netz bestimmt Einsteiger-Tutorials. Wenn Reguläre Ausdrücke, dann irgendwas über Fortgeschrittenes Programmieren oder Theoretische Informatik. ;-)
feline


 
Beitrag 27.06.2011 12:35     Antworten mit Zitat

mit z.B. 'http\:[^>]*>' kannst du eine url bis einschließlich > überspringen.
Wenn du Akronyme NUR in URL Texten finden willst, also z.b. <a href="xyz" ... >Text</a>
ist das ganze sehr einfach. Wenn du aber im ganzen Text suchen willst, wird's etwas komplizierte...
feline


 
Beitrag 27.06.2011 13:32     Antworten mit Zitat

Ich habe das eben mal getestet ..

Gegeben ist:

Code:

$text = 'Das ist ein text in der shg vorkommt.<br />
Und ein link der <a href="http://domain.tld/shg/forum">SHG Bommelhausen</a>';

mit einem simplen:

Code:

$text = preg_replace('~(http\:[^>]*>|)(shg)~i', '$1<acronym title="Selbsthilfegruppe">$2</acronym>', $text)


werden BEIDE shg erweitert, hingegen das shg in der url wird nicht angetasted.
Nach dem replace sieht $text so aus:

Code:

$text = 'Das ist ein text in der <acronym title="Selbsthilfegruppe">shg</acronym> vorkommt.<br />
Und ein link der <a href="http://domain.tld/shg/forum"><acronym title="Selbsthilfegruppe">SHG</acronym> Bommelhausen</a>


Viel Spaß :-)
feline


 
Beitrag 27.06.2011 14:37     Antworten mit Zitat

Ach ja .. du kannst anstelle '(http\:[^>]*>|)' auch ein '(href.?=[^>]*>|)' nehmen..
Dann gehts auch mit https ;-)
Vielleicht noch zur erklärung des ganzen ..
(href.?=[^>]*>|) findet entweder ein href .. > oder eben nix (|).
Du kannst natürlich noch festlegen das nach den Suchwort andere Zeichen folgen müssen, z.B. Punkt. Bindestrich oder Leerzeichen.
In den Fall wäre der Suchbegriff:

Code:

'~(href.?=[^>]*>|)(shg)([\.\-\s]+)~i'


und die Ersetzung:

Code:

'$1<acronym title="Selbsthilfegruppe">$2</acronym>$3'


Denke jetzt kommste klar :-)
feline


 
Beitrag 02.07.2011 21:47     Antworten mit Zitat

Ich frage mich, warum ich mir das antue ..
Versuche zu helfen und ... ernte absolute Ignoranz.
Danke, habe ich verstanden ...
Sabine Schm


 
Beitrag 03.07.2011 11:41     Antworten mit Zitat

Hallo Feline,

ich arbeite regelmäßig in einem Win 7-Forum mit. Dort ist es unüblich, dass sich für Lösungen bedankt wird. Wenn es doch geschieht: Fühle Dich geehrt!

In diesem Sinne!

Liebe Grüße

Sabine
feline


 
Beitrag 03.07.2011 14:06     Antworten mit Zitat

Wenn jemand fragt:

Zitat:

Hat jemand eine Idee, die Muster zu verbessern?

und ich mich hinsetze, ein Testszenario aufbaue und genau das liefere was gesucht/gewünscht wurde, kann ich wohl zumindest eine Reaktion des fragenden erwarten.
Sonst wird hier doch auch auf die Höflichkeit gesetzt ... da sollte die Administration mit leuchtendem Beispiel vorangehen.
Doris


 
Beitrag 03.07.2011 15:30     Antworten mit Zitat

feline hat geschrieben:


Sonst wird hier doch auch auf die Höflichkeit gesetzt ...
vielleicht wurde genau deswegen (noch) nicht geantwortet?

.
_________________
Ein Tier zu retten veraendert nicht die Welt, aber die ganze Welt veraendert sich für dieses Tier.
Sabine Schm


 
Beitrag 03.07.2011 15:50     Antworten mit Zitat

Hallo Feline,

ich kann (und will) nicht für Nina sprechen, aber könnte es nicht auch sein, daß Nina noch keine Zeit gefunden hat, Dein Testscenario durchzuprüfen und dazu etwas zu schreiben.

Immer sofort den Holzhammer rauszuholen, finde ich, ehrlich gesagt, doof. Ich weiß allerdings (und schätze es oftmals), dass Leute, die aus dem Ruhrgebiet kommen, immer sehr direkt in ihrer Sprache sind. ;-)

Liebe Grüße

Sabine
feline


 
Beitrag 04.07.2011 15:26     Antworten mit Zitat

Da hast du vollkommen recht .. ich rede nie um den Brei herum .. ich sage was ich zu sagen habe und wem das nicht passt, kann mir gestohlen bleiben ...
Inzwischen isses wir auch egal ob Nina das verwendet oder nicht, ich werden jedenfalls keine Hilfe mehr geben, das ist mir echt zu blöd...