zanda: preg_split - wie nach ; trennen aber &xxxx; ausklammern?

Hallo Forumsteilnehmer(in),

ich moechte einen Text via preg_split splitten.
Der Trenner ist das Semikolon ";".

Ausgenommen sein sollen aber HTML Formatierungen
wie z.B. "ü", also im Grunde alle "&....;".

Ich bin aber leider nicht so fit in RegEx, sodass
ich hier leider nicht ganz Durchblicke und mein
folgender Code nicht funktioniert ...

preg_split("/([^uml]{3});/", $text);

... dort wird zwar nur nach Umlauten negiert,
was auch nicht funktioniert, wenn jemand aber
weiss wie man allgemein mit "&....;", waere das
der Hammer :)

Danke fuer jede Hilfe.
Gruss Zanda

  1. Hi,

    Ausgenommen sein sollen aber HTML Formatierungen

    wenn ich dazu mal die Perl-Doku zitieren darf (perldoc perlfaq4):

    """
    How can I split a [character] delimited string except when inside [character]?

    [...]
    Due to the restriction of the quotes, this is a fairly complex problem. Thankfully, we have Jeffrey Friedl, author of a highly recommended book on regular expressions, to handle these for us. He suggests (assuming your string is contained in $text):

    @new = ();
         push(@new, $+) while $text =~ m{
             "([^"\]*(?:\.[^"\]*)*)",?  # groups the phrase inside the quotes
           | ([^,]+),?
           | ,
         }gx;
         push(@new, undef) if substr($text,-1,1) eq ',';
    """

    Für PHP ist das Problem identisch, der explizite Code natürlich nicht.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Hi,

    In der PHP-Doku steht im Abschnitt PCRE/PatternSyntax auch etwas zu
    "Assertions", damit kannst du das machen.

    preg_split('/(?<!&\w\w\w|.&\w\w|..&\w);/', $text);

    Mit (?<!...) gibst du den Teil an, der nicht vorkommen darf (wird dann auch
    nicht als Ergebnis, oder in diesem Fall Trennzeichen, ausgewertet).
    Zu beachten ist aber, daß variable StringLängen (alles mit +, ? und *)
    hierbei nicht erlaubt sind.

    Grüße,
    milky

    1. Hi Milky,

      das mit den "Assertions", also (?<!...) kannte ich nicht!

      Folgendermassen habe ich das jetzt angewandt und es klappt.
      preg_split("/(?<!&....|&...);/", $text]);

      Tolle Funktion! :)
      Vielen Dank Milky,

      Gruss Zanda