[Regex] Alles bis auf bestimmte Wörter

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [Regex] Alles bis auf bestimmte Wörter

    Hi!

    Ich möchte in einem regulären Ausdruck alles bis auf ein paar bestimmte Wörter ausschließen.
    Wie mache ich das am besten?

    Es soll ungefähr diese erfüllen:

    Quellcode

    1. /erstes (^zweites|^erstesKind) Ende/

    Folge Strings sollen erlaubt sein:
    Erstes zweites Ende
    Erstes erstesKind Ende

    und per preg_replace ersetze ich nachher alles andere durch ein Wunschwort, z.b.
    Erstes unerlaubt Ende -> Erstes Ersatz Ende

    Gruß!
    Max123
    Die Japaner glauben jetzt auch, sie könnten den Superrechner verkaufen. Das wäre
    so, als würde man einen Jumbo-Jet nehmen, vorne und hinten die Spitzen absägen,
    davon 10 Stück zusammenschweißen und als ultimativen Super-Jet verkaufen.
  • Das ersetzen von gegebenen Zeichenketten ist zwar einfach, aber Teilausdrücke um längere Zeichenketten zu negieren bedarf es einer speziellen "Technik". Für einzelne Zeichen geht das so ähnlich wie bei deinem Versuch mit eckigen Klammern und dem ^

    Aber hier brauchst du positive/negative Lookaheads...
    Kenne mich damit auch nicht so gut. Versuch mal dein Glück:

    * http://de.wikibooks.org/wiki/Websiteentwicklung:_PHP:_Regul%C3%A4re_Ausdr%C3%BCcke
    * http://simplecontent.net/phpsnippets/1/markhits.html
  • Um das Problem zu konkretisieren:

    Ich habe einen BBcode eingefügt:
    Text

    Nun möchte ich aber nur bestimmte Schriften zulassen, z.B. Arial, Times, Comic.
    Wenn diese nicht als Argument angegeben werden, dann sollen die Tags entfernt werden.
    Also wird aus:
    Text -> Text

    Ich habe gerade:
    ((?<!\[font=(arial|times|comic)](Text))\[/font\])

    Aber dadurch wird mit nur als [/font] zurückgeliefert, den öffenen Tag kann ich also nicht entfernen.
    Die Japaner glauben jetzt auch, sie könnten den Superrechner verkaufen. Das wäre
    so, als würde man einen Jumbo-Jet nehmen, vorne und hinten die Spitzen absägen,
    davon 10 Stück zusammenschweißen und als ultimativen Super-Jet verkaufen.
  • Ich würde das nicht so machen. Bastel dir einen RegEx der dir die signifikanten Teile liefert und prüf dann im callback ob die Schriftart zulässig ist oder nicht. Das ist keine Aufgabe die ich vom RegEx machen lassen würde.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Hier mal mein aktueller Ausdruck, fertig für PHP:

    /(\\[font=([a-z]*)((?<!=arial|=times|=comic)\\]))(.*)(\\[\/font\\])/isU
    $4 liefert mir dann bei ungültigen Schriftarten nur den Text zwischen den Tags.

    Ich werde mal testen, ob deine Methode eventuell schneller ist.
    Die Japaner glauben jetzt auch, sie könnten den Superrechner verkaufen. Das wäre
    so, als würde man einen Jumbo-Jet nehmen, vorne und hinten die Spitzen absägen,
    davon 10 Stück zusammenschweißen und als ultimativen Super-Jet verkaufen.
  • @SeBa:
    Das Problem bei deiner Lösung ist, dass ich den ganzen Text im nachhinein nochmal durchgehen muss, um die falschen Tags zu finden.
    Dazu muss ich den öffnenden Tag finden und entfernen und den nächsten schließenden Tag entfernen. Das wären eine Menge Stingoperationen, die denk ich nicht so effizient sind und auch etwas umständlich beim Einbau sind.
    Die Japaner glauben jetzt auch, sie könnten den Superrechner verkaufen. Das wäre
    so, als würde man einen Jumbo-Jet nehmen, vorne und hinten die Spitzen absägen,
    davon 10 Stück zusammenschweißen und als ultimativen Super-Jet verkaufen.
  • Das Problem löst du schnell und sauber mit einer Indirektstufe mehr. Such erst den gesamten Tag den du bearbeiten willst, dann zerlegst du diese mit deinem zweiten Ausdruck und guckst ob nicht nur die Syntax stimmt, sondern auch Inhaltlich zulässig sind.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Algo1:
    Macht direkt alles mit einem regulären Ausdruck.

    Algo2:
    Liefert mir alle Tags durch einen rA.
    Ich schaue in einer Schleife für jede Schriftart, ob sie zulässig ist (auch mit rA).
    Falls unzulässig, suche ich den Tag und entferne diesen per preg_replace. Dabei suche ich nach dem gesamten Ausdruck (...) und ersetzte dies durch den Text.


    Hier mal die Zeiten:

    Methode Regex1
    Dauer: 2.3199

    Methode Regex2
    Dauer: 19.0784


    Also bleibe ich wohl bei dem komplizierten Ausdruck... :P
    Die Japaner glauben jetzt auch, sie könnten den Superrechner verkaufen. Das wäre
    so, als würde man einen Jumbo-Jet nehmen, vorne und hinten die Spitzen absägen,
    davon 10 Stück zusammenschweißen und als ultimativen Super-Jet verkaufen.
  • Bei Variante 2 suchst du ja auch doppelt den Text ab was nicht unbedingt nötig ist. Wenn du das mit einmal suchen machst sollte das genauso schnell gehen.
    Das machst du, indem du den Text mit preg_replace_callback durchläufst, in der callback-Routine prüfst ob die Schriftarte korrekt ist (würde ich ohne RegEx machen) und dadrin dann entweder die gewünsche Transformation (z.b. HTML-Tags) zurücklieferst oder halt einen leeren String, wenns falsch war. Das Ergebnis ist dann nach einem Durchlauf, dass alle richtigen Tags ersetzt werden und alle anderen raus sind.

    Bei 3 einfachen Schriftarten ist es auch kein Problem, da kannst du bei Variante 1 bleiben, aber das wird verdammt unhandlich wenn du mehrere Schriftarten hast oder die Schriftarten dynamisch zulassen wilst (also die zulässigen Schriftarten aus einer DB auslesen willst) und dann musst du die Leerzeichen berücksichigien etc..
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Leerzeichen habe ich keine. Aber es ist eine feste Anzahl von ca. 10 Schriftarten geplant. Von daher habe ich mit der ersten Variante da keine Probleme.
    Wenn ich mal Zeit habe, werde ich mir die von dir genannte Funktion einmal anschauen.
    Danke für den Tipp, ich habe mir schon gedacht, dass es auch einfacher geht. ;)

    Aber wie kann ich in php eine variable effizient mit mehreren Werten vergleichen?
    Die Japaner glauben jetzt auch, sie könnten den Superrechner verkaufen. Das wäre
    so, als würde man einen Jumbo-Jet nehmen, vorne und hinten die Spitzen absägen,
    davon 10 Stück zusammenschweißen und als ultimativen Super-Jet verkaufen.
  • "Max123" schrieb:

    Aber wie kann ich in php eine variable effizient mit mehreren Werten vergleichen?


    Ausprobieren ;) Generell sind Stringoperationen schneller als Reguläre Ausdrücke, da RegEx in PHP (bei standardmäßig deaktiviertem opcode-cache) bei jedem Seitenaufruf neu erstellt werden müssen. Das allein kostet auch eine Menge Performance.

    Aber ein Automat zu erzeugen und zu matchen ist bestimmt schneller als 10 Stringoperationen durchzuführen. Das kommt vermutlich auf den konkreten Anwendungsfall an.