Regulärer Ausdruck - Leerzeichen aus String in Anführungszeichen ignorireren

rootssw

Erfahrenes Mitglied
Hallo!

Ich weiss, der Titel sagt nicht 100% viel aus, aber ein besserer viel mir nicht ein.
Ich bin (mal wieder) auf der Suche nach einem Regulärem Ausdrück, der volgendes Leistet:

aus der Zeichenkette (nur ein Beispiel)

Wörter ohne Anführungszeichen "Wörter in Anführungszeichen" Wieder Wörter ohne Anführungszeichen

Soll folgendes Array werden (entweder natürlich per preg_split oder preg_match):

  1. Wörter
  2. ohne
  3. Anführungszeichen
  4. Wörter in Anführungszeichen
  5. Wieder
  6. Wörter
  7. ohne
  8. Anführungszeichen
Das heisst, ich benötige einen Regulären Ausdruck, der einen Satz bei den "whitespaces" splittet, aber die Wörter in Anführungszeichen auslässt.
Somit soll verhindert werden, dass Satzteile in Anführungszeichen gesplittet werden.

Ich hab' schon einiges probiert und gesucht, die Ergebnisse jedoch waren eher blamabel! :-(

Ich hoffe ich konnte mein Problem klar und deutlich schildern und mir kann jemand weiter helfen!

Vielen herzlichen Dank im voraus
 
Ich hab da mal was probiert aber mit preg_match_all() vieleicht ist es ja hilfreich...
Es leuft nicht 100% wenn man bisseln rumspielt mit dem String.

PHP:
$string = "\"das macht spaß\" Wörter ohne. \"HEHE\" Anführungszeichen \"Wörter in Anführungszeichen\" Wieder Wörter ohne Anführungszeichen \"rofl\"";

preg_match_all("/(\"(.*)\" |\"(.*)\")|((.*) |\w{2,}+)/smU",$string,$m);

echo "<b>String :</b> $string<br><br>";

/*! nur für die ausgabe wie das array aufgebaut ist !*/
foreach($m as $k => $v) {
   if(is_array($v)) {
      echo "<b>\$m[$k] => $v :</b><br>";
      foreach($v as $kk => $vv)
         echo "&nbsp;&nbsp;<i>\$m[$k][$kk] => $vv</i><br>";
   }else		
      echo "\$m[$k] => $v :<br>";
}

---------------Ausgabe ---------------
String : "das macht spaß" Wörter ohne. "HEHE" Anführungszeichen "Wörter in Anführungszeichen" Wieder Wörter ohne Anführungszeichen "rofl"

$m[0] => Array :
$m[0][0] => "das macht spaß"
$m[0][1] => Wörter
$m[0][2] => ohne.
$m[0][3] => "HEHE"
$m[0][4] => Anführungszeichen
$m[0][5] => "Wörter in Anführungszeichen"
$m[0][6] => Wieder
$m[0][7] => Wörter
$m[0][8] => ohne
$m[0][9] => Anführungszeichen
$m[0][10] => "rofl"
--------------- ENDE ---------------

MfG
christian
 
Zuletzt bearbeitet:
Eine kleine Optimierung apocalypses Vorschlag, und schon funkioniert's:
PHP:
<?php

	$string = 'Wörter ohne Anführungszeichen "Wörter in Anführungszeichen" Wieder Wörter ohne Anführungszeichen';
	if( preg_match_all('/(?:"([^"]+)" ?)|((?:[^"]+) |\w{2,}+)/Uu', trim($string), $matches) ) {

		foreach( $matches[2] as $key => $value ) {
			if( trim($value) != '' ) {
				$matches[1][$key] = $value;
			}
		}
		$matches = array_map('trim', $matches[1]);

		echo '<pre>';
		print_r($matches);
		echo '</pre>';

	}

?>
 
Naja, schon nicht schlecht.
Aber was ist denn mit folgendem Satz:

Wörter ohne Anführungsze=ichen="Wörter in Anführungszeichen" Wieder Wörter ohne Anführungszeichen

Die Gleichheitszeichen symbolisieren nur andere Sonderzeichen.
Wenn ich das jetzt teste erhalte ich:

Array
(
[0] => Wörter
[1] => ohne
[2] => Anf
[3] => hrungsze
[4] => ichen
[5] => Wörter in Anführungszeichen
[6] => Wieder
[7] => Wörter
[8] => ohne
[9] => Anf
[10] => hrungszeichen
)

Das liegt wohl daran, dass bei deinem Suchmuster bei allem getrennt wird, was kein normaler Text ist (so auch das 'ü' bei Anführungszeichen).
Mir will es aber nicht gelingen, das Suchmuster so zu modifizieren, dass auch Sonderzeichen in das Array mit aufgenommen werden. :-(
 
Zurück