regexp
bleicher
- perl
Grüße,
eigentlich geht es ja um regexp für php-funktionen, aber die sollen ja denen von pearl entsprechen?
nun - die idee ist:
$maint=preg_replace("/\[url:(.+)](.+)\[\/url\]/","<a href=\"$1\" target=\"_blank\">$2</a>", $maint);
[url:href]text[/url] wird ja erkannt ABER wenn ich in einer zeile mehr als einen habe, wird der erste [url:] und der letze[/url] ersetzt - all das dazwischen bleibt "as is".
aus
[url:example.com]example1[/url] [url:example.com]example2[/url]
wird sowas wie
<a href="example.com" target="_blank">example1[/url] [url:example.com]example2</a>
wie kann man dem helfen? ich weiss nciht mal rech twie ich dir frage stellen soll "wie erzwingt man das erkennen des kürzestmöglichen string"?
MFG
bleicher
Hallo bleicher,
Du solltest beim Regex die schliessende "eckige Klammer" von [url] auch maskieren.
Also: "/[url:(.+)](.+)[/url]/"
Übrigens solltest du den Regex folgendermassen anpassen:
$str = preg_replace('#\[url=(.*)\](.*)\[/url\]#Uis', '<a href="\1">\2</a>', $str);
So findet der Regex die kleinst Möglichen Übereinstimmungen.
Dein Regex würde einen String mit 2 Links darinen falsch bearbeiten.
Grüsse,
Lupus
eigentlich geht es ja um regexp für php-funktionen, aber die sollen ja denen von pearl entsprechen?
Es heisst
Practical Extraction and Reporting Language. PERL
nun - die idee ist:
$maint=preg_replace(
"/[url:(.+)](.+)[/url]/",
^
"<a href="$1" target="_blank">$2</a>", $maint);
>
> [url:href]text[/url] wird ja erkannt ABER wenn ich in einer zeile mehr als einen habe, wird der erste [url:] und der letze[/url] ersetzt - all das dazwischen bleibt "as is".
>
> aus
> [url:example.com]example1[/url] [url:example.com]example2[/url]
>
> wird sowas wie
>
> <a href="example.com" target="\_blank">example1[/url] [url:example.com]example2</a>
>
> wie kann man dem helfen? ich weiss nciht mal rech twie ich dir frage stellen soll "wie erzwingt man das erkennen des kürzestmöglichen string"?
du willst non greedy Patterns verwenden. (.+?)
Perl
$urlpat = qr/
\[
url:
(
https?:// #anti XSS, Mache Schemavorgaben
.+?
)
\]
(.+?)
\[
\/url
\]/x;
$string =~ s/$urlpat/<a href="$1" target="\_blank">$2</a>/g;
mfg Beat
--
Woran ich arbeite:
[X-Torah](http://www.elcappuccino.ch/cgi/tok.pl?extern=1-pub-com3306-1)
<°)))o>< ><o(((°>o
Grüße,
@Beat & @Lupus:
danke - es funktioniert -
und ich habe nun erfahren dass es den greed-faktr gibt^^
P.S:
@Beat:
https?:// #anti XSS, Mache Schemavorgaben
heißt das, dass url nur dann erkannt wird, wenn es einem http oder https folgt?
aber die funktion ist cmsintern - sicherheit käme da gegen administrierungswerkzeuge ;/
MFG
bleicher
https?:// #anti XSS, Mache Schemavorgaben
heißt das, dass url nur dann erkannt wird, wenn es einem http oder https folgt?
ja
relative urls sind dadurch nicht möglich.
aber die funktion ist cmsintern - sicherheit käme da gegen administrierungswerkzeuge ;/
Im Grunde ist ein isolierter BBCode in dieser Fassung auch für ein internes CMS so ungeeignet, denn es warnt dich nicht davor, wenn du Bockmist baust.
BBCode produziert HTML
Du musst genau so eine Validitätsprüfung deines BBCodes vornehmen, wie für HTML.
Jetzt schreibst du zum Beispiel:
[url:path/to/file][url:path/to/another/file]myfile[/url][/url]
Deine Transformation sollte dich auf solche Fehler aufmerksam machen.
mfg Beat
Grüße,
relative urls sind dadurch nicht möglich.
ich wusste nciht, ass relative urls ein sicherheitsrisiko darstellen O_o verzicht wäre etwas schwer - da ich ja innerhalb der seite relativ addressiere.
Im Grunde ist ein isolierter BBCode in dieser Fassung auch für ein internes CMS so ungeeignet, denn es warnt dich nicht davor, wenn du Bockmist baust.
Jetzt schreibst du zum Beispiel:
[url:path/to/file][url:path/to/another/file]myfile[/url][/url]
es würde helfen, wenn ich aus der classe der erlaubten zeichen die klammern [] ausschließen könnte, aber ([^[]].+) tut es nicht >_>
MFG
bleicher
Grüße,
relative urls sind dadurch nicht möglich.
ich wusste nciht, ass relative urls ein sicherheitsrisiko darstellen O_o verzicht wäre etwas schwer - da ich ja innerhalb der seite relativ addressiere.
Im Grunde ist ein isolierter BBCode in dieser Fassung auch für ein internes CMS so ungeeignet, denn es warnt dich nicht davor, wenn du Bockmist baust.
Jetzt schreibst du zum Beispiel:
[url:path/to/file][url:path/to/another/file]myfile[/url][/url]es würde helfen, wenn ich aus der classe der erlaubten zeichen die klammern [] ausschließen könnte, aber ([^[]].+) tut es nicht >_>
Ich nehme nochmals Perl:
Diesmal schliesse ich [] als gültige Zeichen aus.
Perl
$urlpat = qr/
[
url:
(
https?:// #anti XSS, Mache Schemavorgaben
[^[]]+?
)
]
([^[]]+?)
[
/url
]/x;
$string =~ s/$urlpat/<a href="$1" target="_blank">$2</a>/g;
Eine andere generelle Überlegung.
Schneller als man denkt, hat man eine Sprache erfunden, und leider schleichen sich Inkonsistenzen ein.
Was machst du mit Attributen, die du übergeben willst?
Mein (öffentlicher) BBCode sieht etwas anders aus:
<[url:http://example.com>[label:Beispiellink]]
Ich kann einer Funktion eine Anzahl Parameter mitgeben, die sowohl optional sind, und deren Reihenfolge auch egal ist.
Ich habe mich immer mehr hin zu einer Syntax bewegt, die für egal welche Form ein uniformes Prozedere aufweist.
Optionale Attribute: Wenn ich eine Funktion erweitere, wird bisheriger Code dadurch nicht invalide.
Reihenfolge der Optionen egal: Ich muss nicht in der Api nachschauen.
Alles was nicht einer Funktion angehört, wird ignoriert.
Beispiel: ich schreibe
<
[url:http://example.com>
[label:Beispiellink]
[target:_blank]
]
target ist aber noch nicht implementiert. Es wird ignoriert.
Auslesen tu ich wie folgt:
Perl
my $bbc_options = qr/(?:[[a-z]+:.+?])*/;
$string = s/[link:\s*($bbc_options)\s*]/bbc_link($1)/eg;
sub bbc_link{
#hier lese ich die Optionen schön aus
# validiere sie, und/oder ersetze mit default
# und gebe den Link zurück
}
Bevor du also daran gehst, die Authoring Hilfen zu basteln, mach dir Gedanken über eine allgemeine API, die dann aber beim Design jeder Funktion einhältst.
Mal als Gedankenanregung.
mfg Beat
Grüße,
danke -
das system scheint änlich dem hiesigen system zu sein. nun ich weiss bisher zu wenig von derartigem um ein ansatz haben zu können.
bis ich mir gedanken um die functionsinterne strukturen mache wird noch etwas zeit vergehen^^
MFG
bleicher