preg_replace

PHP, Ajax, CSS, HTML, Javascript
Eben für die wirklich Harten, die alles selber machen.
Benutzeravatar
Giga4000
Beiträge: 181
Registriert: Sa 26.Nov, 2005 09:19
Wohnort: Hamburg
Kontaktdaten:

preg_replace

Beitrag von Giga4000 »

Hallo, ich versuche einen Link umzuwandeln. Dieser sieht genauso aus wie eine URL bei phpBB.

Code: Alles auswählen

	$patterns[] = '#\[url=([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*?)\]([^?\n\r\t].*?)\[/url\]#is';
	$replacements[] = '<a href="' . \${1} . '" target="_blank">' . \${2} . '</a>';
So habe ich es versucht, aber es hat nicht geklappt. Ich müsste es hinbekommen, dass am Anfang \${1} mit dem Link und \${2} mit der Beschreibung ersetzt wird! Kann mir vll. jemand den Code korrigieren?

Danke!
Site: www.mx-forums.de - New!
phpBB MODs: Click Here
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Wenn Du anstelle \${1} besser \\1 nimmst?
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Giga4000
Beiträge: 181
Registriert: Sa 26.Nov, 2005 09:19
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Giga4000 »

Hmm, jetzt gibt er bei diesem Code:

Code: Alles auswählen

	$patterns[] = '#\[url=([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*?)\]([^?\n\r\t].*?)\[/url\]#is';
	$replacements[] = '<a href="' . \\1 . '" target="_blank">' . \\2 . '</a>';
Das hier aus:

Code: Alles auswählen

<a href="1" target="_blank">2</a>
Site: www.mx-forums.de - New!
phpBB MODs: Click Here
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Was kam vorher raus?
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Giga4000
Beiträge: 181
Registriert: Sa 26.Nov, 2005 09:19
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Giga4000 »

Der Link war einfach leer und die Fehlermeldung sah so aus:

Code: Alles auswählen

Notice: Undefined variable: 1 in /www/usersites/m-r/mx-forums/pub/v2/includes/functions.php on line 71

Notice: Undefined variable: 2 in /www/usersites/m-r/mx-forums/pub/v2/includes/functions.php on line 71

Notice: Undefined variable: 1 in /www/usersites/m-r/mx-forums/pub/v2/includes/functions.php on line 71

Notice: Undefined variable: 2 in /www/usersites/m-r/mx-forums/pub/v2/includes/functions.php on line 71
Übrigens steht über dem Kopf der Seite noch:

Code: Alles auswählen

Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /www/usersites/m-r/mx-forums/pub/v2/includes/functions.php on line 71

Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /www/usersites/m-r/mx-forums/pub/v2/includes/functions.php on line 71
Site: www.mx-forums.de - New!
phpBB MODs: Click Here
Benutzeravatar
Bootenks
Beiträge: 1836
Registriert: Sa 29.Mai, 2004 23:36
Wohnort: G?rlitz (?stlichste Stadt Deutschlands)

Beitrag von Bootenks »

Würde das Replacement mal so probieren :P

Code: Alles auswählen

$replacements = "<a href=\"\${1}\" target=\"_blank\">\${2}</a>";
Nur ein Informatik Student. ^^
Benutzeravatar
Giga4000
Beiträge: 181
Registriert: Sa 26.Nov, 2005 09:19
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Giga4000 »

Danke, hat funktioniert!
Site: www.mx-forums.de - New!
phpBB MODs: Click Here
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

Ja ja, das Arbeiten mit Regulären Ausdrücken kann einen zur Verzweiflung bringen. :D

@ Boo
Bist du da mittlerweile Fit drin?
Ich hätte da auch noch ein Problem für das ich bisher noch keine Lösung gefunden habe. ^6
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
Bootenks
Beiträge: 1836
Registriert: Sa 29.Mai, 2004 23:36
Wohnort: G?rlitz (?stlichste Stadt Deutschlands)

Beitrag von Bootenks »

Bin ganz gut zu gebrauchen, wenn es um reguläre Ausdrücke geht :P

Also frag ruhig :) Wenn ich es nicht gleich auf Anhieb weiss, finde ich es auf jedenfall für dich heraus.
Nur ein Informatik Student. ^^
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

Das hört sich ja schon mal prima an. :)

Also - Ich habe einen HTML Code wie z.B. diesen:

Code: Alles auswählen

AmigaLink.de war ursprünglich ein Original phpBB Vanilla Board zur Demonstration meines <a href="viewtopic.php?t=6" title="easyUCP">easyUCP MODs</a>. Welcher wiederum nur entstanden ist, weil ich -für mein <a href="Http://www.essenmitfreude.info" target="_blank" title="Essen mit Freude">EmF</a> Board- keine Profilbearbeitung gefunden habe, die dem User Übersichtlichkeit bietet ohne dem Admin das Leben unnötig schwer zu machen. Also ein einfaches UCP das nicht überladen und weitestgehend Kompatibel zu vorhandenen und zukünftigen Profil-MODs ist.
[center](Textauszug aus meinem Blog.)[/center]
Wie du siehst gibt es darin interne und externe links. Diese möchte ich (wie in meinem Forum) mit einem icon versehen, anhand dessen der Betrachter erkennen kann ob ein neues Fenster geöffnet wird oder nicht.
Bei externen links funktioniert das auch. Aber die internen machen mir Ärger. ^6
Momentan nutze ich diesen Code:

Code: Alles auswählen

	$text = preg_replace('!<a href="(.*?)" target="_blank" title="(.*?)">(.*?)</a>!', '<a href="\\1" target="_blank" title="\\2" alt="\\2"><img src="images/ext_link.gif" border="0" alt="\\2" title="\\2"> \\3</a>', $text); // extern
#	$text = preg_replace('!<a href="(.*?)" title="(.*?)">(.*?)</a>!', '<a href="\\1" target="_self" alt="\\2" title="\\2"><img src="images/intern_link.gif" border="0" alt="\\2" title="\\2"> \\3</a>', $text); // intern
[center](Die Problemzeile ist auskommentiert.)[/center]
Das preg_replace(); für die internen links, fügt bei jedem link das icon ein. ¦9
Ich vermute mal, es wäre kein Problem wenn bei den internen links ein target="_self" existieren würde. Aber das ist leider nicht der Fall.
Ich wollte schon TinyMCE entsprechend anpassen (von dem kommt der HTML-Code). Aber dafür reichen meine Javascript Kenntnisse leider nicht aus (es gibt mehrere sachen die ich da gerne ändern würde). ^6
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
Bootenks
Beiträge: 1836
Registriert: Sa 29.Mai, 2004 23:36
Wohnort: G?rlitz (?stlichste Stadt Deutschlands)

Beitrag von Bootenks »

Sorry kam jetzt erst dazu deinen Beitrag zu lesen. Ich schaue es mir gleich mal an. ^^

Edit:

Zum Verständnis:

Du willst, dass bei externen Links ein Icon davor gesetzt wird und bei internen nicht?

Edit 2:
Aso du hast 2 Images. Eine für die internen und einen für die externen Links. Und im Moment wird überall das interne Bildchen eingefügt. Die Lösung ist recht simple: Du musst in der Definition von

Code: Alles auswählen

<a href="(.*?)"
präziser werden. Ich teste kurz was...

Was soll eigentlich in .*? <--- das ? bewirken?

Edit 3:

Muss leider jetzt los. Werde mich morgen drum kümmern... hoffe dass reicht dir :P
Zuletzt geändert von Bootenks am Di 12.Dez, 2006 16:09, insgesamt 1-mal geändert.
Nur ein Informatik Student. ^^
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

Das Image für externe Links wird vollkommen koreckt bei jedem externem Link eingefügt. Das Image für interne wird jedoch bei jedem Link eingefügt, was ja falsch ist.

Tja, und das Fragezeichen. Wie soll ich das erklären? Ohne das Fragezeichen klappen beide preg_replace(); Anweisungen nicht bzw. führen zu ganz üblen fehldarstellungen.
Standardmäßig versuchen die Quantifier, auf einen so großen Text wie möglich zu passen. Dies kann zu Problemen führen: Angenommen es liegt eine Zeichenkette

Code: Alles auswählen

$str = "[b]text[/b]text[b]text[/b]"
vor, und wir möchten daraus

Code: Alles auswählen

"<b>text</b>text<b>text</b>"
machen. Versuchen wir es folgendermaßen:

Code: Alles auswählen

$str = preg_replace("!\[b\](.*)\[/b\]!","<b>text</b>",$str);
so erhalten wir als Ergebnis

Code: Alles auswählen

"<b>text[/b]text[b]text</b>"
- nicht ganz das, was wir wollten. Um dieses Verhalten abzustellen, setzen wir hinter den Quantifier ein Fragezeichen "?":

Code: Alles auswählen

$str = preg_replace("!\[b\](.*?)\[/b\]!","<b>text</b>",$str);
und das gewünschte Ergebnis ist erreicht!
Verstanden? :)


Lass dir Zeit.
Sollte mir zwischenzeitlich selber eine Lösung einfallen (obwohl ich mich im moment mit einer anderen sache beschäftige), sag ich bescheid. :)
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
Bootenks
Beiträge: 1836
Registriert: Sa 29.Mai, 2004 23:36
Wohnort: G?rlitz (?stlichste Stadt Deutschlands)

Beitrag von Bootenks »

Ich würde es einfach so machen:

Code: Alles auswählen

$pattern1 = "/<a href=\"((?=http:\/\/|www)[a-z0-9:\/.\?\=]+?)\".*?title=\"(.*?)\".*?>(.*?)<\/a>/i";
$pattern2 = "/<a href=\"((?!http:\/\/)(?!www)[a-z0-9:\/.\?\=]+?)\".*?title=\"(.*?)\".*?>(.*?)<\/a>/i";

$replacement1 = "<a href=\"\\1\" title=\"\\2\" alt=\"\\2\" target=\"_blank\" /><img src=\"images/ext_link.gif\" border=\"0\" alt=\"\\2\" title=\"\\2\" />\\3</a>";
$replacement2 = "<a href=\"\\1\" title=\"\\2\" alt=\"\\2\" target=\"_self\" /><img src=\"images/intern_link.gif\" border=\"0\" alt=\"\\2\" title=\"\\2\" />\\3</a>";

$text = preg_replace($pattern1, $replacement1 , $text);
$text = preg_replace($pattern2, $replacement2, $text);
Das wäre das einfachste... Sobald www oder http:// davorsteht wird er als externer Link gesehen... Es kann aber noch weiter verfeinert werden... Musst nur was sagen, welche Anforderungen du da noch setzt!
Zuletzt geändert von Bootenks am Mi 13.Dez, 2006 14:39, insgesamt 2-mal geändert.
Nur ein Informatik Student. ^^
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

Danke erstmal.
Das mit dem www bzw. http ist zwar eine gute Idee, aber nicht wirklich die Lösung.
Der HTML-Code wird vom TinyMCE generiert, wobei die Links über eine Eingabehilfe erstellt werden. Im Normalfall Kopiere ich (oder wer immer das Script nutzt) einen link einfach nur in das Formular und Klickt an ob es ein interner oder ein externer link sein soll. Es kann also durchaus vorkommen (bzw. ist sogar die Regel) das alle links mit http und www sind.

Die Unterscheidung muss also über das vorhanden sein des target="_blank" Atributs erfolgen um Idiotensicher zu sein. ;)

// EDIT
Hier mal ein Beispiel zur Veranschaulichung (siehe Attachment).
Dei Code ist im Einsatz. :)
Die links zum Blog sind beide ohne http und www.
Die links zu Babelfish sind beide mit http und www.
Jeweils einmal mit und einmal ohne target="_blank".
Dateianhänge
blog.jpg
Zuletzt geändert von AmigaLink am Mi 13.Dez, 2006 15:14, insgesamt 2-mal geändert.
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
Bootenks
Beiträge: 1836
Registriert: Sa 29.Mai, 2004 23:36
Wohnort: G?rlitz (?stlichste Stadt Deutschlands)

Beitrag von Bootenks »

Naja dann kann ich aber nichts herausfiltern... Ohne Unterschiede im Link kann ich ja nichts ändern... Du meintest ja auch dass sogar das target bei den Links überall fehlt.. Wie soll man es dann herausfinden???
Nur ein Informatik Student. ^^
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Ja, stelle ich mir auch als unmöglich vor.
Die Link-Inhalte sind ja die gleichen...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

Ja und nein. In dem HTML tag für interne links ist kein target vorhanden und in denen für externe links ist ein target="_blank" vorhanden. Das ist halt der kleine aber feine Unterschied anhand dessen man filtern kann bzw. muss.
Fragt sich halt nur wie das gehen könnte.
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Schwierig.
Aber wie schaut es denn mit der Stelle aus, an denen das Target eingefügt wird?
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

Wie gesagt, der HTML Code wird von TinyMCE erzeugt. Das ist ein Javascript WYSIWYG Editor.
Wenn meiner einer Javascript beherrschen würde, könnte ich mir die entsprechende stelle anpassen und sogar dort direkt die icons einfügen. Aber ich habe (abgesehen vom wissen) weder Zeit noch lust den kompletten Editor zu durchforsten, deswegen möchte ich die Anpassung halt bei der Darstellung machen. :)
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Tja und da müsste man prüfen, ob ein target überhaupt angegeben wurde, also besser erst ein preg_match oder strpos bevor man mit preg_replace den Link aufbaut.
Direkt mit der Ersetzung wird das wohl schwieriger bis gar unmöglich sein...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

Es könnte sein das sich das erstmal erledigt hat bzw. noch komplizierter wird.
Ich habe eben etwas entdeckt das die Linkeingabe im Editor noch mächtiger macht. Wenn ich das aktiviere (bin mir noch nicht schlüssig), dann sind sogar PopUps und spezielle css Angaben möglich. :cool:

Werde mich wohl erstmal mit meiner jetzigen Fassung zufrieden geben und beizeiten mir den Javascript Code nochmal näher ansehen. Es lohnt sich echt, sich mit diesem Editor ein wenig mehr zu befassen.
Obwohl es in meinem Fall eigentlich Blödsinnig ist, da ich meinen Blog recht einfach halten wollte.
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
Giga4000
Beiträge: 181
Registriert: Sa 26.Nov, 2005 09:19
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Giga4000 »

Hallo,

Ich habe nochmal eine Frage. Wie kann ich htmlentities auf den ersetzten Code anwenden:

Code: Alles auswählen

	$patterns[] = '#\[code](.*?)\
#i';
$replacements[] = "<blockquote><span>Code:</span><pre>" . htmlentities("\${1}") . "</pre></blockquote>";

$string = preg_replace($patterns, $replacements, $string);[/code]

Irgendwie funktioniert das leider nicht. Kann mir vll. nochmal jemand helfen?
Site: www.mx-forums.de - New!
phpBB MODs: Click Here
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Auf den Text vor oder nach der Ersetzung?
Während geht nicht.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Giga4000
Beiträge: 181
Registriert: Sa 26.Nov, 2005 09:19
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Giga4000 »

Hmm, ich dachte eigentlich, dass htmlentities auf alles was zwischen [code] und [/code] steht angewendet wird!
Site: www.mx-forums.de - New!
phpBB MODs: Click Here
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

So nicht. Du kannst nicht direkt auf diese Weise beim Ersetzen noch Formatierungen durchführen...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Antworten