[PERL] kleines Prob

Hi Leuts,

ich habe ein kleines Problem, wo ich noch nichtmal weiss, was es eigendlich für Eines ist :smiley:
am Besten, ich fange gleich mal mit einem Beispiel an

$DecodeNews =~ s/(\[i\])(.+?)(\[\/i\])/$2/isg;

damit ersetze ich in meinem Newsscript blah durch blah. Damit will ich ganz einfach verhindern, das HTML-Tags benutzt werden können. Ich möchte aber dennoch die Möglichkeit geben, bestimmte erlaubte Formatierungen zu benutzen.
Meine Frage ist nun dieser ‚Platzhalter‘. Also das ‚.+?‘

  1. Wie nennt man diese ‚Dinger‘, damit ich das nächste mal meine Frage besser formulieren kann :wink:
  2. Was gibt es alles für ‚Platzhalter‘ und was ‚bewirken/bedeuten/beinhalten‘ sie?

Ich kenne z.B. nur ‚.+?‘ ‚\S+‘ und ‚\S+?‘ habe aber null Ahnung, was genau diese ‚Dinger‘ ersetzen.
.+? Könnte vielleicht alle normalen Zeichen ersetzen …
\S+ evtl alle Zahlen
\S+? wäre dann vielleicht Zahlen und Zeichen oder?
Ich weisses einfach nicht :frowning:
vielleicht kann mich ja mal einer Aufklären :wink:

mfg
Martin

Ich bin auch nicht so fit, was reguläre Ausdrücke anbetrifft. Cheatah kenn sich da besser aus.
Aber Doku hast du im Haus. Bei der Perldoku heißt das entsprechende Kapitel perlre. Also je nach System perltoc perlre oder die Datei perlre.html und perlop.html#Regexp_Quote_Like_Operators.

Ansonsten schau mal bei http://www.perltutor.com vorbei. Da steht zwar (noch) nichts über reguläre Ausdrücke, aber das kommt wohl noch.

So jetzt werd ich versuchen den Ausdruck auseinanderzunehmen.

$DecodeNews =~ s/([i])(.+?)([/i])/$2/isg;

$DecodeNews =~
$DecodeNews ist der string, der durchsucht wird.
=~ ist der „Regulärer-Ausdruck-operator“

s/$s1/$s2/ ist der Ersetzungsoperator im Ggsatz zu m//
$s1 ist das suchmuster, $s2 beschreibt die ersetzung.

([i])
Die runden klammern bewirken, daß das entsprechende Muster innerhalb der Klammer in die Variablen $1, $2 usw. geschrieben werden, und zwar von links nach rechts.
Die Backslashes „quoten“ ein Zeichen. Die Eckigen Klammern würden ohne den Backslash als ein „Metazeichen“ angesehen werden. (Eckige Klammern bestimmen eine „Zeichenklasse“ z.b. [a…z] wären alle zeichen zw. a und z
Das i ist einfach ein i. (Manchmal ist eine Zigarre ganz einfach eine Zigarre (Sigmund Freud))

(.+?)
Rund Klammern wie gehabt (in $2, hier der Text zw. und ).
. ist ein beliebiges Zeichen ausser \n

  • beschreibt ein einmaliges oder mehrfaches Vorkommen

/$2/
das ist die ersetzung.
zu \I sagt das Handbuch:

When the bracketing construct ( … ) is used, \ matches the digit’th substring. Outside of the pattern, always use $'' instead of ‚‘ in front of the digit. (While the \ notation can on rare occasion work outside the current pattern, this should not be relied upon. See the WARNING below.) The scope of $ (and $`, $&, and $’) extends to the end of the enclosing BLOCK or eval string, or to the next successful pattern match, whichever comes first. If you want to use parentheses to delimit a subpattern (e.g., a set of alternatives) without saving it as a subpattern, follow the ( with a ?:.

was ich dummerweise auch nicht ganz verstehe.
Auf jeden Fall werden alle texts durch _text_´s ersetzt. (und das ist doch eigentlich das Gegenteil von dem was du willst.)

/isg;
i=Groß- Kleinschreibung beachten
s=Behandle den String als eine Zeile
g=Ersetze alle Vorkommnisse (ohne g wäre es immer nur der erste)

Was dein Problem mit den erlaubten/nicht erlaubten Tags angeht, so laufe doch einfach durch eine Liste der erlaubten Tags und lösche die unerlaubten durch Ersetzten mit Nichts.

hoffedirgeholfenzuhaben.

holli

hehe,

also erstmal ein uuuriges Dankeschön für Deine Megamail :smile:
Ich muss mich wohl zu unverständlich ausgedruckt haben :wink:
was der String

$DecodeNews =~ s/(\[i\])(.+?)(\[\/i\])/$2/isg;

bewirkt/was er macht, war mir schon völlig klar :wink:
nur das .+? war mir ein Räzel :wink:

also, ich hoffe ich hab Dir damit jetzt keine unnötige Arbeit gemacht *hoff*. Trotzdem danke für die Beschreibung :smiley:

gruss,
Martin

hehe,

Re: hehe,

also erstmal ein uuuriges Dankeschön für Deine Megamail :smile:
Ich muss mich wohl zu unverständlich ausgedruckt haben :wink:
was der String

$DecodeNews =~
s/([i])(.+?)([/i])/$2/isg;

bewirkt/was er macht, war mir schon völlig klar :wink:
nur das .+? war mir ein Räzel :wink:

Auf jeden Fall, weißt du jetzt, wo du nachlesen musst.
Wass mir aber nicht klar ist, ist die Bedeutung von \I.
Da müsste eigentlich nur I stehen. Der Backslash ist im ungünstigsten Fall gefährlich (siehe mein Ausschnitt aus der peldoc).

Aber es stimmt doch, daß du die [i] durch _ersetzt? Und das ist ja wie gesagt, falsch rum? Oder hab ich irgendwo einen Denkfehler?

also, ich hoffe ich hab Dir damit jetzt keine unnötige Arbeit
gemacht *hoff*. Trotzdem danke für die Beschreibung :smiley:

selbst wenn. Irgendein unbekannter Surfer hat bestimmt was gelernt. Und das ist ja irgendwie auch der Sinn dieser Seite.

gruss,
Martin

zurückgruss,
holli_

holla,

Auf jeden Fall, weißt du jetzt, wo du nachlesen musst.
Wass mir aber nicht klar ist, ist die Bedeutung von \I.
Da müsste eigentlich nur I stehen. Der Backslash ist im
ungünstigsten Fall gefährlich (siehe mein Ausschnitt aus der
peldoc).

LOOOL, soory … aber das war natürlich total schlecht von mir :wink: Das Problem ist ein Anderes. Ich habe an der Stelle auch nur I geschrieben doch komischerweise hat das PRE das ich dazu benutzt habe nix gebracht und das kurzerhand als echten HTML-Tag angesehen. Entsprechen verschwand diese TAG natürlich und hat mal eben alles schräg gemacht. Hab mich gewundert wie das geht (siehe auch im Brett ‚Anregungen/Lob/Kritik‘) und musste mir was einfallen lassen um das zu umgehen. Hab also das \ eingebaut, da ein Leerzeichen noch schlechter in diesem Fall gewesen wäre :wink:
so, ich hoff Du hast verstanden was mein ‚Darstellungsproblem‘ betrifft :wink:

Aber es stimmt doch, daß du die [i] durch ersetzt?
Und das ist ja wie gesagt, falsch rum? Oder hab ich irgendwo
einen Denkfehler?

Was die Sachen selber betrifft ein [I] in den korrekten HTML-Tag zu verwandeln ist eigendlich der, das ich damit mein ‚eigenen‘ Interpreter (?) schreiben will/geschrieben hab. Also bei dem I ist das natürlich Banane, aber bei z.B. HREF wirds schon interessanter. Da macht der User einfach url=[http://www.wer-weiss-was.de]Wer Weiss Was?[/url] und das wird entsprechend umgesetzt. Um da eine einfache, klare und durchschaubare Linie einzubringen habe ich das mit I B und U auch getan :wink:
so, das war mein Grund für das Vorgehen :wink:

selbst wenn. Irgendein unbekannter Surfer hat bestimmt was
gelernt. Und das ist ja irgendwie auch der Sinn dieser Seite.

:wink: ok, dann bin ich ja berihugt :wink:

tschö,
MF

holla,

Auf jeden Fall, weißt du jetzt, wo du nachlesen musst.
Wass mir aber nicht klar ist, ist die Bedeutung von \I.
Da müsste eigentlich nur I stehen. Der Backslash ist im
ungünstigsten Fall gefährlich (siehe mein Ausschnitt aus der
peldoc).

LOOOL, soory … aber das war natürlich total schlecht von mir
:wink: Das Problem ist ein Anderes. Ich habe an der Stelle auch
nur I geschrieben doch komischerweise hat das PRE das ich dazu
benutzt habe nix gebracht und das kurzerhand als
echten HTML-Tag angesehen. Entsprechen verschwand diese TAG
natürlich und hat mal eben alles schräg gemacht. Hab mich
gewundert wie das geht (siehe auch im Brett
‚Anregungen/Lob/Kritik‘) und musste mir was einfallen lassen
um das zu umgehen. Hab also das \ eingebaut, da ein
Leerzeichen noch schlechter in diesem Fall gewesen wäre :wink:
so, ich hoff Du hast verstanden was mein ‚Darstellungsproblem‘
betrifft :wink:

In Zukunft benutze einfach die Quotierungszeichen (&gt:wink:

Aber es stimmt doch, daß du die [i] durch ersetzt?
Und das ist ja wie gesagt, falsch rum? Oder hab ich irgendwo
einen Denkfehler?

Was die Sachen selber betrifft ein [I] in den korrekten
HTML-Tag zu verwandeln ist eigendlich der, das ich damit mein
‚eigenen‘ Interpreter (?) schreiben will/geschrieben hab. Also
bei dem I ist das natürlich Banane, aber bei z.B. HREF wirds
schon interessanter. Da macht der User einfach
url=[http://www.wer-weiss-was.de]Wer Weiss Was?[/url] und das
wird entsprechend umgesetzt. Um da eine einfache, klare und
durchschaubare Linie einzubringen habe ich das mit I B und U
auch getan :wink:
so, das war mein Grund für das Vorgehen :wink:

Ach so.
naja, dann brauchst du einen besseren regulären Ausdruck, der auch die komplexen Tags erfasst.

selbst wenn. Irgendein unbekannter Surfer hat bestimmt was
gelernt. Und das ist ja irgendwie auch der Sinn dieser Seite.

:wink: ok, dann bin ich ja berihugt :wink:

Jau. berihugt.

holli

In Zukunft benutze einfach die Quotierungszeichen (&gt:wink:

jo, eben … Deine Quotierungszeichen sind auch umgewandelt worden :wink: hehehe, das hab ich nämlich auch schon probiert :stuck_out_tongue:

Ach so.
naja, dann brauchst du einen besseren regulären Ausdruck, der
auch die komplexen Tags erfasst.

Hab ich auch schon alles. Damit hab ich ja auch keine Probs mehr :wink: Ich kann die HREF´s umwandeln, email adressen, BLOCKCODE usw … alles paletti :wink:

bye,
mf

Hi,

ich habe ein kleines Problem, wo ich noch nichtmal weiss, was
es eigendlich für Eines ist :smiley:

nachdem nun alles mögliche und auch wichtige zu dem Thema gesagt ist, ist Dein eigentliches irgendwie unter den Tisch gefallen :wink:

Meine Frage ist nun dieser ‚Platzhalter‘. Also das ‚.+?‘

Wie Markus schon sagte, findest Du in

perldoc perlre

Antwort darauf. Die wichtigsten Zeichen erkläre ich trotzdem mal:

  1. Wie nennt man diese ‚Dinger‘, damit ich das nächste mal
    meine Frage besser formulieren kann :wink:

Insgesamt heißt es ‚Regular Expression‘ oder kurz ‚RegExp‘; die ‚Dinger‘ würde ich einfach RegExp-Symbole nennen.

  1. Was gibt es alles für ‚Platzhalter‘ und was
    ‚bewirken/bedeuten/beinhalten‘ sie?

Viele - siehe perldoc perlre! :smile:

Ich kenne z.B. nur ‚.+?‘ ‚\S+‘ und ‚\S+?‘ habe aber null
Ahnung, was genau diese ‚Dinger‘ ersetzen.

Sie ersetzen gar nichts, sondern matchen:

  • ‚.‘ auf irgendein Zeichen (außer die in $/ (s. perldoc perlvar), sofern nicht die /s-Option angegeben wurde),

  • ‚+‘ auf ein oder mehr des vorhergegangenen Elements (hier also auf ein oder mehr von irgendeinem Zeichen),

  • ‚?‘ auf den kürzest gefundenen String (ansonsten sind RegExp ‚greedy‘ und matchen soweit sie können=,

  • ‚\S‘ auf alles außer ‚\s‘ :wink:

  • ‚\s‘ auf Whitespaces, also Leerzeichen, \n, \r, \t usw.

\S+ evtl alle Zahlen

Das wäre \d+ (\d ist eine Ziffer, \D jedes andere Zeichen).

vielleicht kann mich ja mal einer Aufklären :wink:

Insgesamt bestehen RegExp aus ganz kurzen Symbolen, die in Kombination zu komplexen Strukturen führen können. Die RFC-konforme (RFC 1738, ftp://ftp.isi.edu/in-notes/rfc1738.txt) RegExp zur Erkennung von URLs ist übrigens satte acht Kilobyte groß… :smile:

Cheatah