pekue: preg_replace nicht geschlossene Anführungszeichen entfernen

Hallo zusammen an diesem arbeitsamen Samstag nachmittag,

ich hab ein offenbar nicht ganz gewöhnliches Problem (jedenfalls kennt Google keine Anwort :( und ich hoffe mir kann hier einer der Regex-Könige aus der Patche helfen.
Ich habe einen x-beliebigen String aus dem ich intelligent nicht geschlossene Anführungszeichen entfernen will - sprich:
jedes Vorkommen von ' "' dem nicht irgendwo ein '" ' folgt und jedes '" ' dem nicht ein ' "' vorangegangen ist.

  
$testStrings = array(  
	' word1 "word2 word3" "word4 ', //=> ' word1 "word2 word3" word4 '  
	' "word 1 word2 word3', //=> ' word 1 word2 word3',  
	' word 1 word2" word3', //=> ' word 1 word2 word3'  
	' word1 "word2 "word2 word4" ', //=> ' word1 word2 "word2 word4" ',  
	' word1 "word2 "word2 word4" word5', // ' word1 word2 "word2 word4" word5',  
	' word1 "word2 "word2 word4" word5 "word6 ', //=>' word1 word2 "word2 word4" word5 word6 ',  
	' word1 "word2 "word2 word4" "word5 word6" ', //=>' word1 word2 "word2 word4" "word5 word6" ',  
	' word1 "word2 word3" word4" ' //=>' word1 "word2 word3" word4 '  
);  

Ich steh da grade ziemlich im Wald :(
Kann mir wer helfen?
Vielen Dank im voraus!
pekue

  1. Hi!

    Ich habe einen x-beliebigen String aus dem ich intelligent nicht geschlossene Anführungszeichen entfernen will - sprich:

    Was ist mit nicht geöffneten" Anführungszeichen?

    Jedenfalls wird das ein ziemliches RegExp-Monster, bei dem du nicht nur mit Assertions arbeiten musst. Du kannst ja nicht nur "einfach" nach vorn und zurück schauen, du musst auch noch jedes Mal Paare suchen und ungerade oder gerade Anzahlen berücksichtigen. Da bekommst du jedoch Problem, weil es ein solches Auswahlkriterium nicht gibt. Kann man sicher irgendwie anders lösen. Mit noch mehr Aufwand. Und wenn du dann fertig bist, fällt dir drei Wochen später ein Fehler auf und dein Gedächtnis hat das Monster bereits so erfolgreich vergesen, dass du dir mühsam heraussuchen musst, was jeder Teilausdruck macht, damit du erst einmal wieder die Arbeitsweise verstehst und dann noch den Fehler finden musst.

    Ich würde das herkömmlich angehen, ungefähr so: Finde die jeweils ersten Vorkommen von ' "' und '" '. Wenn die Position des ersten größer als die des zweiten ist, hast du einen Fehler gefunden, den du ja ausschneiden willst. Bedenke, dass dabei der Rest-String kürzer wird, und du ein Zeichen weiter vorn mit dem restlichen Teilstring fortfahren musst.

    Lo!

  2. Grüße,
    ich würde es echt lieber mit einer eigener funktion lösen -
    laufe den string durch, beim treffen auf " überprüfe ob es ein öffnendes (leerzeichen davor) oder shcließendes (leerzeichen danach) ist, und speichere jeweils die position des etzten treffers - sollte es zur "kollision" kommen (string ende, noch ein " gleicher art) lösche den vorigen.

    MFG
    bleicher

    --
    __________________________-

    FirefoxMyth
  3. Moin!

    Ich habe einen x-beliebigen String aus dem ich intelligent nicht geschlossene Anführungszeichen entfernen will - sprich:
    jedes Vorkommen von ' "' dem nicht irgendwo ein '" ' folgt und jedes '" ' dem nicht ein ' "' vorangegangen ist.

    Zerteile deinen String an jedem Vorkommen von ' "'. explode()

    In jedem Einzelteil außer dem ersten muss dann '" ' vorkommen, damit das erste Anführungszeichen erlaubt ist. Falls nein, setze den String mit seinem Vorgänger zusammen.

    Setze dann das Array wieder mit ' "' zusammen.

    Dasselbe umgekehrt nochmal mit '" ' - die Ausnahme ist hierbei dann der letzte Stringteil.

    Die Sonderbehandlung für Anführungszeichen direkt am Stringanfang oder am Stringende wäre auch noch zu beachten.

    Reguläre Ausdrücke sind da ein ziemlicher Irrweg.

    - Sven Rautenberg

    1. Hi,

      ergänzender Hinweis:

      Zerteile deinen String an jedem Vorkommen von ' "'. explode()

      In jedem Einzelteil außer dem ersten muss dann '" ' vorkommen, [...]

      Die Sonderbehandlung für Anführungszeichen direkt am Stringanfang oder am Stringende wäre auch noch zu beachten.

      Eine aufwendigere „Sonderbehandlung” kann man in solchen Fällen umgehen, in dem man das ganze Prozedere nicht auf $text, sondern auf ' '.$text.' ' anwendet. Dann muss man zwischen „am Anfang/Ende” und „Mittendrin” nicht unterscheiden - und nur zum Schluss die hinzugefügten Leerzeichen am Anfang und Ende wieder entfernen.

      MfG ChrisB

      --
      “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]