PHP Unterscheidung verschiedener Fälle/Kombinationen

cardinal

Lt. Junior Grade
Registriert
Mai 2010
Beiträge
467
Hallo Community,

ich schreibe gerade an einem Plugin für Wordpress. Dort kann man per Shortcode Einträge aus einer Datenbank ziehen und die dann irgendwo auf dem Blog anzeigen lassen. Mit unterschiedlichen Optionen kann dann gefiltert werden.

Der Short code besteht aus einem Keyword, welches WP erkennt und dahinter dann die Optionen (welche optional sind).
Es sollte dann so aussehen:
Code:
[keyword option1=wert option2=wert option3=wert option4=wert]

Ich speichere die Werte dann in Variablen ab um weiter damit arbeiten zu können. Per default sind alle Werte leer.

Gibt es eine schlaue Möglichkeit die verschiedenen Kombinationen der Optionen zu unterscheiden?

Bspw.:
[keyword] --> soll alle Datensätze ausgeben ohne Filterung
[keyword option2=wert option4=wert] --> Ausgabe soll nach beiden Optionen gefiltert werden
[keyword option1=wert option2=wert] --> Ausgabe soll nach beiden Optionen gefiltert werden

Natürlich soll jegliche Kombination möglich sein.

Bleibt mir nichts anderes übrig, als für jeden Fall alles zu definieren oder hat jemand einen Tip wie ich das einfacher lösen könnte?

Vielen Dank schon mal,
Lui
 
Was willst du denn genau machen? Diesen Shortcode (also den Kram in eckigen Klammern) parsen, um an die eventuell gesetzten Optionen zu kommen? Und aus den gesetzten Optionen anschließend eine SQL Abfrage aufbauen?

Hast du eventuell mal ein konkretes Beispiel von einem Shortcode und der Abfrage, die daraus resultieren soll?
 
KillerCow schrieb:
Was willst du denn genau machen? Diesen Shortcode (also den Kram in eckigen Klammern) parsen, um an die eventuell gesetzten Optionen zu kommen? Und aus den gesetzten Optionen anschließend eine SQL Abfrage aufbauen?

Hast du eventuell mal ein konkretes Beispiel von einem Shortcode und der Abfrage, die daraus resultieren soll?

Genau, ich will aus den Optionen eine SQl Abfrage machen.

Hier ein Beispiel:
Code:
Hier soll nicht gefiltert werden, da keine Optionen angegeben werden. Also alles zeigen.
[shortcode] -> SELECT * FROM tabelle;

Dann haben wir bspw. die Optionen "ID", "name" und " nachname" (Werte der Optionen werden in Variablen gespeichert)
[shortcode id=123 name=Lui] --> SELECT * FROM tabelle WHERE id = $id AND name = $name;

[shortcode name = Lui nachname = Lui] --> SELECT * FROM tabelle WHERE name = $name AND nachname = $nachname;

Es sollen alle Kombinationen der Optionen genutzt werden können.
Ich hoffe, das ist einigermaßen verständlich :D

Ich dachte möglicherweise an einen switch der checkt ob die Werte null bzw leer sind. Ist nur ein recht großer Aufwand das für alle möglichen Kombinationen abzudecken. Das wird extrem verschachtelt.
 
wordpress ist schon exterm ekelig..
hier eine nicht mider ekelige lösung.. (muss mir noch regex beibringen :()

PHP:
<?php
$shortcode = trim(substr('[shortcode name=Lui nachname=LuiLui]', 10, -1));
$options = explode(' ', $shortcode);

$where = '';
foreach ($options as $option) {
    list($key, $value) = explode('=', $option);

    $where .= ' AND ' . $key . ' = "' . $value . '"';
}

$sql = 'SELECT * FROM tabelle WHERE 1' . $where;
 
Damit könntest du sowas parsen (gleich mal mit Anführungs- und Leerzeichen):
Code:
<?php

$text = <<<'STR'
Hier soll nicht gefiltert werden, da keine Optionen angegeben werden. Also alles zeigen.
[shortcode] -> SELECT * FROM tabelle;

Dann haben wir bspw. die Optionen "ID", "name" und " nachname" (Werte der Optionen werden in Variablen gespeichert)
[shortcode id=123 name=Lui] --> SELECT * FROM tabelle WHERE id = $id AND name = $name;
[shortcode id=123 name="Lui will Kentucky"] --> SELECT * FROM tabelle WHERE id = $id AND name = $name;
[shortcode "id 1"=123 name="Lui will Kentucky"] --> SELECT * FROM tabelle WHERE id = $id AND name = $name;

[shortcode name = Lui nachname = Lui] --> SELECT * FROM tabelle WHERE name = $name AND nachname = $nachname;
[shortcode name = Lui nachname = "Lui will Kentucky"] --> SELECT * FROM tabelle WHERE name = $name AND nachname = $nachname;
[shortcode "name 1" = Lui nachname = "Lui will Kentucky"] --> SELECT * FROM tabelle WHERE name = $name AND nachname = $nachname;
[shortcode "name 1" = "Lui" "nachname" = "Lui will Kentucky"] --> SELECT * FROM tabelle WHERE name = $name AND nachname = $nachname;
[shortcode "name 1" = "Lui jaja" "nachname 2" = "Lui will Kentucky"] --> SELECT * FROM tabelle WHERE name = $name AND nachname = $nachname;

Es sollen alle Kombinationen der Optionen genutzt werden können.
STR;
$paramp = <<<'REGEX'
(?<key>("[^"=]+"|[^\s=]+))\s?=\s?(?<value>("[^"\]]+"|[^\s\]]+))
REGEX;
$param = "#$paramp#";
$regex = <<<REGEX
#(?<code>\[(?<tag>[^\s]+) (?<options>($paramp\s*)+)\])#
REGEX;

$tags = [];
if( preg_match_all( $regex, $text, $m ) )
{
	$unquote = function( $s ) { return preg_replace( "#^\"(.*)\"$#", "\\1", $s ); };
	
	for( $i = 0, $e = sizeof( $m["options"] ); $i < $e; ++$i )
	{
		$x = [
			"code"    => $m["code"][$i],
			"tag"     => $m["tag"][$i],
			"options" => []
		];
		
		if( preg_match_all( $param, $m["options"][$i], $m2 ) )
		{
			for( $i2 = 0, $e2 = sizeof( $m2["key"] ); $i2 < $e2; ++$i2 )
			{
				$f = [
					"key"   => $unquote( $m2["key"][$i2] ),
					"value" => $unquote( $m2["value"][$i2] )
				];
				$x["options"][] = $f;
			}
		}
		
		$tags[] = $x;
	}
}
Ergebnis:
Code:
array (size=8)
  0 => 
    array (size=3)
      'code' => string '[shortcode id=123 name=Lui]' (length=27)
      'tag' => string 'shortcode' (length=9)
      'options' => 
        array (size=2)
          0 => 
            array (size=2)
              'key' => string 'id' (length=2)
              'value' => string '123' (length=3)
          1 => 
            array (size=2)
              'key' => string 'name' (length=4)
              'value' => string 'Lui' (length=3)
  1 => 
    array (size=3)
      'code' => string '[shortcode id=123 name="Lui will Kentucky"]' (length=43)
      'tag' => string 'shortcode' (length=9)
      'options' => 
        array (size=2)
          0 => 
            array (size=2)
              'key' => string 'id' (length=2)
              'value' => string '123' (length=3)
          1 => 
            array (size=2)
              'key' => string 'name' (length=4)
              'value' => string 'Lui will Kentucky' (length=17)
  2 => 
    array (size=3)
      'code' => string '[shortcode "id 1"=123 name="Lui will Kentucky"]' (length=47)
      'tag' => string 'shortcode' (length=9)
      'options' => 
        array (size=2)
          0 => 
            array (size=2)
              'key' => string 'id 1' (length=4)
              'value' => string '123' (length=3)
          1 => 
            array (size=2)
              'key' => string 'name' (length=4)
              'value' => string 'Lui will Kentucky' (length=17)
  3 => 
    array (size=3)
      'code' => string '[shortcode name = Lui nachname = Lui]' (length=37)
      'tag' => string 'shortcode' (length=9)
      'options' => 
        array (size=2)
          0 => 
            array (size=2)
              'key' => string 'name' (length=4)
              'value' => string 'Lui' (length=3)
          1 => 
            array (size=2)
              'key' => string 'nachname' (length=8)
              'value' => string 'Lui' (length=3)
  4 => 
    array (size=3)
      'code' => string '[shortcode name = Lui nachname = "Lui will Kentucky"]' (length=53)
      'tag' => string 'shortcode' (length=9)
      'options' => 
        array (size=2)
          0 => 
            array (size=2)
              'key' => string 'name' (length=4)
              'value' => string 'Lui' (length=3)
          1 => 
            array (size=2)
              'key' => string 'nachname' (length=8)
              'value' => string 'Lui will Kentucky' (length=17)
  5 => 
    array (size=3)
      'code' => string '[shortcode "name 1" = Lui nachname = "Lui will Kentucky"]' (length=57)
      'tag' => string 'shortcode' (length=9)
      'options' => 
        array (size=2)
          0 => 
            array (size=2)
              'key' => string 'name 1' (length=6)
              'value' => string 'Lui' (length=3)
          1 => 
            array (size=2)
              'key' => string 'nachname' (length=8)
              'value' => string 'Lui will Kentucky' (length=17)
  6 => 
    array (size=3)
      'code' => string '[shortcode "name 1" = "Lui" "nachname" = "Lui will Kentucky"]' (length=61)
      'tag' => string 'shortcode' (length=9)
      'options' => 
        array (size=2)
          0 => 
            array (size=2)
              'key' => string 'name 1' (length=6)
              'value' => string 'Lui' (length=3)
          1 => 
            array (size=2)
              'key' => string 'nachname' (length=8)
              'value' => string 'Lui will Kentucky' (length=17)
  7 => 
    array (size=3)
      'code' => string '[shortcode "name 1" = "Lui jaja" "nachname 2" = "Lui will Kentucky"]' (length=68)
      'tag' => string 'shortcode' (length=9)
      'options' => 
        array (size=2)
          0 => 
            array (size=2)
              'key' => string 'name 1' (length=6)
              'value' => string 'Lui jaja' (length=8)
          1 => 
            array (size=2)
              'key' => string 'nachname 2' (length=10)
              'value' => string 'Lui will Kentucky' (length=17)
 
Mmmh...okay...könntest du mir den Code erklären? Ich steig da nicht so ganz durch :)
 
Naja, die äußere Schleife geht alle validen Tags durch ([abc foo=bar "foo bar"="foo bar" ...]) und die Innere nimmt die Attribute (foo=bar "foo bar"="foo bar") auseinander. Musst du dir halt den Regex ansehen.
 
Zurück
Oben