ubuntuusers.de

Regex gesucht

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

blackbird Team-Icon

Avatar von blackbird

Anmeldungsdatum:
19. November 2004

Beiträge: Zähle...

Wohnort: Hermagor, Kärnten - Österreich

Hallo Leute,
Ich suche eine Regular Expression (PHP), die folgendes macht:

'foobar', 'foo, bar', foo, bar


soll zu so einem array werden:

foobar
foo, bar
foo
bar

Weiß jemand, wie ich das hinkriege?

Bearbeitet von blackbird:

Fehler ausgebessert

Sidney

Anmeldungsdatum:
4. März 2005

Beiträge: 196

Erste Idee wäre explode, aber dann hättest du im ersten Teil ('foobar') noch die Anführungszeichen. Müsstest eben mit nem foreach-loop rauslöschen.

Sid

blackbird Team-Icon

(Themenstarter)
Avatar von blackbird

Anmeldungsdatum:
19. November 2004

Beiträge: Zähle...

Wohnort: Hermagor, Kärnten - Österreich

Sidney hat geschrieben:

Erste Idee wäre explode, aber dann hättest du im ersten Teil ('foobar') noch die Anführungszeichen. Müsstest eben mit nem foreach-loop rauslöschen.

Sid

Das hab ich schon. Ich würde es nur gerne als regex haben, weil meine Methode ist arschlangsam. 😳

Hier der Quelltext:

function split_arguments($argument_string)
{
    $arguments = array();
    $current_argument = '';
    $inside_argument = false;
    for ($i = 0; $i < strlen($argument_string); $i++)
    {
        $char = substr($argument_string, $i, 1);
        if ($char == '\'' && !$inside_argument)
        {
            $current_argument = '';
            $inside_argument = true;
        }
        elseif ($char == '\'' && $inside_argument)
        {
            $arguments[] = $current_argument;
            $inside_argument = false;
            $current_argument = '';
        }
        else
        {
            $current_argument .= $char;
        }
    }
    return $arguments;
} 

Bearbeitet von blackbird:

Quelltext hinzugefügt

Gizmo

Avatar von Gizmo

Anmeldungsdatum:
6. Januar 2005

Beiträge: 377

Sind reguläre Ausdrücke nicht auch langsam?

blackbird Team-Icon

(Themenstarter)
Avatar von blackbird

Anmeldungsdatum:
19. November 2004

Beiträge: Zähle...

Wohnort: Hermagor, Kärnten - Österreich

Gizmo hat geschrieben:

Sind reguläre Ausdrücke nicht auch langsam?

Aber schneller als Zeichenweise durch einen Text zu wühlen.
Au0erdem viel weniger Programmcode.

drunkVoodoo

Anmeldungsdatum:
17. November 2004

Beiträge: Zähle...

Wohnort: $HOME

Hmm ... soweit ich weiss, ist das mit RegExen nicht lösbar, weil du keinen Status mitziehen kannst (also ein Komma in einem String nicht wirklich von einem anderen Komma unterscheiden kannst).
Wenn du allerdings dafür sorgst, dass konsequent *alle* Werte in Anführungszeichen stehen, also so:

'foobar','foo, bar','foo','bar'


dann könntest du das ganze mit

$werte = "'foobar','foo, bar','foo','bar'";
$array = preg_split("/'\s*,\s*'/", substr($werte, 1, -1));


machen ... kann das leider im Moment nicht testen. ( Muss ausserdem wieder an die Arbeit ☹ )

HTH
drunkVoodoo

blackbird Team-Icon

(Themenstarter)
Avatar von blackbird

Anmeldungsdatum:
19. November 2004

Beiträge: 3397

Wohnort: Hermagor, Kärnten - Österreich

drunkVoodoo hat geschrieben:

Hmm ... soweit ich weiss, ist das mit RegExen nicht lösbar, weil du keinen Status mitziehen kannst (also ein Komma in einem String nicht wirklich von einem anderen Komma unterscheiden kannst).
Wenn du allerdings dafür sorgst, dass konsequent *alle* Werte in Anführungszeichen stehen...

Das habe ich auch bei meiner Methode als Problem.
Aber irgendwie wird man dem User auch sagen können, dass er halt auch hier ein Anführungszeichen setzt.

Danke für deinen Quelltext. Ich werde ihn testen wenn ich zu Hause bin. 😉

MaV

Anmeldungsdatum:
12. Dezember 2004

Beiträge: 68

Wieso gehst du nicht gleich einen Schritt weiter und trennst die Elemente mit einem anderen Zeichen?

Das Problem besteht ja nicht nur darin, dass es anscheinend Texte gibt, die auch einen Beistrich beinhalten, sondern auch darin, dass manche User dann sowohl einen Beistrich als auch ein Leerzeichen schreiben, andere wiederum nur einen Beistrich und kein Leerzeichen.
Trennst du nur nach Beistrichen, bleiben die Leerzeichen übrig und du musst sicherheitshalber auch alle Strings mit trim zurechtstutzen. Trennst du nach Bestrich *und* Leerzeichen, wird jeder Beistrich ohne Leerzeichen bei der Trennung nicht verarbeitet.

Nimm ein Zeichen, das garantiert nicht im Text vorkommen wird, und benutze es als Separator, etwa : oder # oder -. Mittels des Separators kannst du dann ohne Aufwand ein explode durchführen.

Beispiel mit ":"

$werte = "foobar:foo, bar:foo:bar";
$arr = explode (":", $werte);

MaV

blackbird Team-Icon

(Themenstarter)
Avatar von blackbird

Anmeldungsdatum:
19. November 2004

Beiträge: 3397

Wohnort: Hermagor, Kärnten - Österreich

Ich verwende das für mein StormCatWiki.
Der Parser sucht nach solchen Blöcken:

<PARSERNAME('parameter1', 'parameter2')>
dieser Teil wird auch an den Parser übergeben
</PARSERNAME>


Diese Werden dann folgend an einen externen Parser übergeben:

  $parser['arguments'] = array('parameter1', 'parameter2');
  $parser['body'] = 'dieser Teil wird auch an den Parser übergeben';

Und Parameter trennt man normalerweise mit einem Beistricht.
Auserdem kann ein ":" auch in einem Parameter vorkommen und tut es auch. 😉

MaV

Anmeldungsdatum:
12. Dezember 2004

Beiträge: 68

blackbird hat geschrieben:

Und Parameter trennt man normalerweise mit einem Beistricht.
Auserdem kann ein ":" auch in einem Parameter vorkommen und tut es auch. 😉

Ah, na bei Parametern ist es klar. Da gefällt mir die Lösung von drunkVoodoo ganz gut.

Der Beistrich war nur eine denkbare Möglichkeit.

MaV

blackbird Team-Icon

(Themenstarter)
Avatar von blackbird

Anmeldungsdatum:
19. November 2004

Beiträge: 3397

Wohnort: Hermagor, Kärnten - Österreich

Kleines Update.
drunkVoodoos Methode hat einen kleinen Nachteil. Wenn Leerzeichen am Anfang oder Ende stehen spinnt er. Ein trim() behebt das allerdings.

Bleibe aber vorerst bei meiner Funktion, weil dort einfach nur Texte in Anführungszeichen verwendet werden und die außenstehenden Wörter und Zeichen einfach ignoriert werden.
So kommen keine falschen Zeichen zum Parser.

drunkVoodoo

Anmeldungsdatum:
17. November 2004

Beiträge: 66

Wohnort: $HOME

blackbird hat geschrieben:

Kleines Update.
drunkVoodoos Methode hat einen kleinen Nachteil. Wenn Leerzeichen am Anfang oder Ende stehen spinnt er. Ein trim() behebt das allerdings.

Tatsächlich ...

blackbird hat geschrieben:

Bleibe aber vorerst bei meiner Funktion, weil dort einfach nur Texte in Anführungszeichen verwendet werden und die außenstehenden Wörter und Zeichen einfach ignoriert werden.
So kommen keine falschen Zeichen zum Parser.

Ist ja auch nicht umsonst die "offizielle" Methode ☺

Antworten |