Regex - Negative Lookbehinds

  • Hi Leute,
    ich häng gerade irgendwie fest, ich denke das die Lösung negative Lookbehinds sind aber ich bekomme es einfach nicht hin.
    Es geht um eine Liste die so aussieht:

    Code
    Lorem Ipsum Lorem Ipsum Lorem Ipsum
    
        <li>Lorem Ipsum</li>
        <li>Lorem Ipsum</li>
        <li>Lorem Ipsum</li>
    
    Lorem Ipsum Lorem Ipsum Lorem Ipsum

    wie man sieht, fehlt das <ul> um die Liste und dieses Tag möchte ich gerne nachziehen.

    Der Regex müsste also nach Listen suchen, die sich nicht in <ul>'s befinden und diese ersetzen.
    Es würde mir schon helfen, wenn ich den Ansatz hätte zu prüfen ob sich vor einem <li> kein <ul> befindet.
    Ich probierte es mit:

    Code
    /(?<!<ul>)\W*<li>/

    aber das klappte irgendwie nicht.

    Gruß crAzywuLf :D

    2 Mal editiert, zuletzt von crAzywuLf (24. März 2010 um 17:17)

  • Naja gibts ne bestimmtes Schema , sprich kommt nach dem <ul> sofort das li oder ist was dazwischen

    Ansonsten such doch einfach nach <li> mit strpos, und schaue was davor steht

  • Naja gibts ne bestimmtes Schema , sprich kommt nach dem <ul> sofort das li oder ist was dazwischen

    Ansonsten such doch einfach nach <li> mit strpos, und schaue was davor steht

    klar, ich hatte nur gehofft, dass ich da eine perverse Regex Lösung einbauen kann^^

    Gruß crAzywuLf :D

  • Wozu den das?

    Wenn das mit der Funktion klappt dann ist es doch in Ordnung


    mfg

  • Wozu den das?

    Wenn das mit der Funktion klappt dann ist es doch in Ordnung


    mfg

    naja^^ an der Stelle woran ich arbeite kann ich aber nur einen Regex benutzen... wie auch immer, falls noch jemand einen Ansatz mit einem Regex kennt, würde ich mich freuen.

    Gruß crAzywuLf :D

  • Okay, gib mir mal dein Document, den das man da nur mit nen Regex weiter kommt glaub ich nicht

    Aber da kann ich dir auch nicht helfen wenn du das sturr mit regex machen willst

  • naja^^ an der Stelle woran ich arbeite kann ich aber nur einen Regex benutzen... wie auch immer, falls noch jemand einen Ansatz mit einem Regex kennt, würde ich mich freuen.

    Sicher gibts den:

    PHP
    (?<!<ul>)[\w]*<li><\/li>

    Er sucht also nach irgenwelchen Zeichen und dem <li></li> Elemten (in diesem Fall leer, setzte also noch beliebige Zeichen dazwischen, oder mache das </li> Elemt weg), findet diese aber nur, wenn kein <ul> davor steht!

    Edit:
    Also das ist ja deinem da oben sehr ähnlich, das hier funktioniert aber, denn du suchst oben über \W nach "nicht-wort-Zeichen", und nicht nach "wort-Zeichen".

    Zitat

    Aber da kann ich dir auch nicht helfen wenn du das sturr mit regex machen willst

    Wieso kann man das nicht einfach nutzen, wenns einfacher ist?
    Oder wenigstens dann, wenn gesagt wird, dass es keine andere Lösung gibt!?
    =)

    wert.TeeeX.de
    Wie gut ist die technische Umsetztung deiner Website wirklich?
    Teste es!

    Einmal editiert, zuletzt von -Bambino- (25. März 2010 um 15:24)

  • Okay, gib mir mal dein Document, den das man da nur mit nen Regex weiter kommt glaub ich nicht

    Aber da kann ich dir auch nicht helfen wenn du das sturr mit regex machen willst

    Es geht nicht um die Lösung selbst, sondern um eine Lösung mit Regex.


    Sicher gibts den:

    PHP
    (?<!<ul>)[\w]*<li><\/li>

    Er sucht also nach irgenwelchen Zeichen und dem <li></li> Elemten (in diesem Fall leer, setzte also noch beliebige Zeichen dazwischen, oder mache das </li> Elemt weg), findet diese aber nur, wenn kein <ul> davor steht!

    Edit:
    Also das ist ja deinem da oben sehr ähnlich, das hier funktioniert aber, denn du suchst oben über \W nach "nicht-wort-Zeichen", und nicht nach "wort-Zeichen".


    Wieso kann man das nicht einfach nutzen, wenns einfacher ist?
    Oder wenigstens dann, wenn gesagt wird, dass es keine andere Lösung gibt!?
    =)

    Code
    Lorem Ipsum Lorem Ipsum Lorem Ipsum
    <ul>
        <li>Lorem Ipsum</li>
        <li>Lorem Ipsum</li>
        <li>Lorem Ipsum</li>
    
    Lorem Ipsum Lorem Ipsum Lorem Ipsum

    mit dem Regex:

    Code
    (?<!<ul>)[w]*<li>

    klappt nicht, theoretisch müsste das erste <li> ja nicht gematched werden... right?

    Gruß crAzywuLf :D

  • Regex sind eine Klasse sache, sie erleichtern enorm die Arbeit das ist klar...

    Dennoch möchte ich mal meine Möglichkeit posten:


    mfg :)

  • Dann denke ich, sollte es vielleicht so klappen. Jetzt findet er das <li> nur, wenn auch ein <ul> davor steht. Und wenn nicht, kannst du ja halt deine Funktion ausführen?!
    Klappts diesmal?
    =)

    LINK

    wert.TeeeX.de
    Wie gut ist die technische Umsetztung deiner Website wirklich?
    Teste es!

  • Unter Umständen könnte man natürlich auch einfach meine komplett fertige Lösung nehmen die alles macht :rolleyes:

  • :rolleyes::rolleyes::rolleyes::rolleyes:
    Unter Umständen wollte ich auch einfach seine Frage beantworten.... =/

    Danke.
    Also ich bin jetzt schon ein Stückchen weiter. Das Problem an dem ganzen Regex ist die optionale Anzahl von Leerzeichen oder Zeilenumbrüchen zwischen dem <ul> und dem <li>.

    Schau mal hier:
    http://www.regex-tester.de/uc_935_de.html

    Der Regex funktioniert wenn alle Listen ohne Leerzeichen aneinander geklatscht sind.
    Wenn man aber jetzt probiert Leerzeichen dazwischen zu erlauben, läuft es nicht mehr:

    Zitat


    (?<!<ul>|<\/li>)\s*((<li>[^<|>]*<\/li>)+)

    Ich hab auch schon \W ausprobiert läuft auch nicht :(
    (Die Leerzeichen zwischen den <li>'s wollte ich erstmal außenvor lassen...)

    Falls da noch wem was einfällt... kann er ja hier posten

    Gruß crAzywuLf :D

    Einmal editiert, zuletzt von crAzywuLf (31. März 2010 um 10:08)

  • also mit dieser Lösung

    PHP
    $pattern = '/(?=<ul>)[\w|\W]+<li>/';

    ist es egal, was für Zeichen dazwischen stehen, egal ob Leerzeichen oder nicht. Und so findest du raus, ob ein <ul> davor steht, oder nicht.
    Bei der Lösung mit dem negativen Lookbehind sind die Leerzeichen das Problem, wie du schon sagst, da verstehe ich auch nicht ganz wieso das nicht klappt.
    Aber kannst du dass denn dann nicht mit der Lösung oben machen, die Antwort obs vorsteht oder nicht, bekommst du ja so... =)

    wert.TeeeX.de
    Wie gut ist die technische Umsetztung deiner Website wirklich?
    Teste es!

  • also mit dieser Lösung

    PHP
    $pattern = '/(?=<ul>)[\w|\W]+<li>/';

    ist es egal, was für Zeichen dazwischen stehen, egal ob Leerzeichen oder nicht. Und so findest du raus, ob ein <ul> davor steht, oder nicht.
    Bei der Lösung mit dem negativen Lookbehind sind die Leerzeichen das Problem, wie du schon sagst, da verstehe ich auch nicht ganz wieso das nicht klappt.
    Aber kannst du dass denn dann nicht mit der Lösung oben machen, die Antwort obs vorsteht oder nicht, bekommst du ja so... =)

    ja ich hab heut schon ein wenig mit deiner Lösung rumgespielt aber ich komme es einfach nicht verneint^^ :rolleyes:

    Gruß crAzywuLf :D

  • Hm...

    Und sowas hilft dir nicht?

    wert.TeeeX.de
    Wie gut ist die technische Umsetztung deiner Website wirklich?
    Teste es!

  • naja^^ dann könnte ich auch meine oder Pion's Lösung nehmen. Wollte das wie gesagt in einem Regex per preg_replace lösen, vll frag ich mal in einem Regex Forum nach. Nur wer sich bei Regexen mit heftigen Sachen beschäftigt wird auch zum Regexperten^^ ;)

    Ich poste die Lösung, wenn ich eine gefunden habe.
    Trotzdem danke für eure Mühe.

    Gruß crAzywuLf :D

    Einmal editiert, zuletzt von crAzywuLf (31. März 2010 um 15:41)

  • Weil ich faul bin und weil ich mich für Regex interessiere und ich glaube, dass es möglich ist, das ganze auch in einem Regex zu lösen, wieso soll ich dann zwei abfeuern?! Ich will mich schließlich auch weiterbilden und meine Fähigkeiten in regexen verbessern^^
    So seh ich das zumindest...

    Zitat


    Wie ist den deine Lösung?


    Meine Lösung umgeht das Problem, schlecht zu erklären, da sich das ganze in einem CMS abspielt.

    Gruß crAzywuLf :D