Seite 1 von 2

PHP - Platzhalter in String - wie lösen?

Verfasst: 27.05.2011, 11:00
von xoni
Hallo @ All,

gegeben sei ein String nach folgendem Muster:

Code: Alles auswählen

 'Rubrik-Name-%ID%'
Mit Hilfe von switch/case möchte ich nun den String weiter verarbeiten.
Dabei soll es egal sein, welchen Wert %ID% hat also...

Code: Alles auswählen

 'Rubrik-Name-12'

Code: Alles auswählen

 'Rubrik-Name-433'

Code: Alles auswählen

 'Rubrik-Name-1012'
soll jeweils durch den case-Fall ''Rubrik-Name-%ID%' erkannt werden.
Ich hoffe, mein Problem ist verständlich.

Danke für jeden Tipp...

Verfasst:
von

Verfasst: 27.05.2011, 11:16
von Synonym
Hm, also was Du so vom Grund her willst habe ich verstanden aber nicht, was Du da mit dem switch willst.

bei "switch" wird ja ein Variable auf einen fest vorgegeben Wert geprüft / verglichen. Du hast aber keinen festen Wert, sondern einen String, der sich ändert.

Sag doch mal genau was Du machen willst.

Verfasst: 27.05.2011, 11:16
von Wirths Media
Leider verstehe ich es nicht ganz...

Ist ein 'Rubrik-Name-'.$id; nicht ausreichend?

Gruß
Daniel

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Verfasst: 27.05.2011, 11:43
von xoni
@ Synonym
bei "switch" wird ja ein Variable auf einen fest vorgegeben Wert geprüft / verglichen. Du hast aber keinen festen Wert, sondern einen String, der sich ändert.
Genau das ist mein Problem.
Bei der switch/case Prüfung soll immer die case anweisung durchgeführt werden,
wenn der String aus ''Rubrik-Name-%ID%' besteht, egal was für einen Wert die ID hat.
Hm, so wie das aussieht, scheint das wohl nicht zu klappen.

@calusa-xx
Ist ein 'Rubrik-Name-'.$id; nicht ausreichend?
Ne, das reicht leider nicht.

Das ganze ist eine art "Weiche" für verschieden URLs

Code: Alles auswählen

case 'Rubrik-Name-#'.$i.'':
if ($this->customer->isLogged()) {
$result = explode("#", $seo_url);
$this->request->get['rubrik_id'] = $result[1];
$this->request->get['route'] = 'account/rubrik/delete';
} else {
$this->request->get['route'] = 'account/login';
}
break;
Danke dennoch für Eure Antworten

Verfasst: 27.05.2011, 11:53
von DanielS
Nimm doch von ''Rubrik-Name-%ID%" den substring(0,12) und prüfe ob er == "Rubrik-Name-" ist.

Verfasst: 27.05.2011, 11:54
von Synonym
Ja und nein.... Ich bin etwas verwirrt und nicht wirklich sicher....

Der String hat also eine Ziffer enthalten am Ende... KEINEN PLATZHALTER, oder ?

Das oben ist also ein Case... Was wäre denn ein anderer? Wie kann der String denn noch aussehen? Daher fragte ich ja, was genau Du vor hast.

Vielleicht wäre es ja viel einfacher einfach zu prüfen, ob da denn eine ID angehängt ist... Vielleicht braucht man das Switch ja gar nicht....

Verfasst: 27.05.2011, 11:56
von Wirths Media
Leider stehe ich noch immer auf dem Schlauch...

Aber wie wäre es mit einer If(eregi('Rubrik-Name-', Anweisung.

Verfasst: 27.05.2011, 12:02
von xoni
@ DanielS
Nimm doch von ''Rubrik-Name-%ID%" den substring(0,12) und prüfe ob er == "Rubrik-Name-" ist.
Das klingt gut; ist zwar etwas "von hinten durch die Brust", sollte aber funktionieren.

Die ID per Get anzuhängen ist in dem Fall leider nicht möglich.
Die ID könnte höchstens ein Bestandteil der URL sein. Die kann ich ja
dann mit explode zerlegen.


Das oben ist also ein Case... Was wäre denn ein anderer? Wie kann der String denn noch aussehen?
z.B. so

Code: Alles auswählen

case 'Kundenkonto-Stammdaten':
                if ($this->customer->isLogged()) {
					$this->request->get['route'] = 'account/edit';
				} else {
					$this->request->get['route'] = 'account/login';
				}
                break;


 				case 'Kundenkonto-Newsletter':
                if ($this->customer->isLogged()) {
					$this->request->get['route'] = 'account/newsletter';
				} else {
					$this->request->get['route'] = 'account/login';
				}
                break;


				case 'Kundenkonto-Adressbuch':
                if ($this->customer->isLogged()) {
					$this->request->get['route'] = 'account/address';
				} else {
					$this->request->get['route'] = 'account/login';
				}
                break;
Der String hat also eine Ziffer enthalten am Ende... KEINEN PLATZHALTER, oder ?
Korrekt, eine Ziffer, keinen Platzhalter.

Verfasst: 27.05.2011, 12:23
von Synonym
Also es wäre einfacher gewesen, wenn Du das switch komplett genannt hättest ohne den Inhalt vom Case.

Ich habe das nun mal so aufgefasst. Es ist immer ein String und der wird im switch verglichen. Nur dieser eine enthält am Ende beliebige Ziffern.

Also so was in der Art (ungetestet):

Code: Alles auswählen

<?php
$string = 'Rubrik-Name-1012';

switch &#40;true&#41;
&#123;
	case &#40;$string === 'Kundenkonto-Stammdaten'&#41;&#58;
		echo 'Kundenkonto-Stammdaten';
		break;
	case preg_match&#40;"/.+-\d+$/", $string&#41;&#58;
		echo 'preg_match';
		break;
	case &#40;$string === 'was_anderes'&#41;&#58;
		echo 'was_anderes';
		break;
	default&#58;
		echo 'default';
&#125;
?>

Verfasst: 27.05.2011, 12:29
von xoni
Also es wäre einfacher gewesen, wenn Du das switch komplett genannt hättest ohne den Inhalt vom Case.
Sorry, ich bin nicht so fit in Sachen "Probleme" beschreiben.
Die preg_match("/.+-\d+$/", $string) Geschichte schau ich mir mal ein wenig genauer an, ich denke das könnte was werden.

Danke Euch allen und ein schönes WE...

Verfasst: 27.05.2011, 12:36
von SloMo
Warum switch-case missbrauchen, wenn es if-elseif-else gibt? Es könnte sich irgendwann rächen...

Verfasst: 27.05.2011, 13:32
von Synonym
@SloMo
Das kommt natürlich darauf an, wie viele Optionen es gibt. Ich bevorzuge auch lieber switch, da es übersichtlicher und auch schneller ist. Allerdings wäre mir das Gebilde (wenn es nur wenige Case gibt) auch zu "umständlich".

Würde da wohl auch eher etwas nehmen wie:
if(preg_match(xxx))
- dann das
else
- und hier dann eventuell das switch/case rein.

Verfasst: 27.05.2011, 13:48
von xoni
Das kommt natürlich darauf an, wie viele Optionen es gibt. Ich bevorzuge auch lieber switch, da es übersichtlicher und auch schneller ist. Allerdings wäre mir das Gebilde (wenn es nur wenige Case gibt) auch zu "umständlich".
Das war auch der Grund, warum ich mich für switch/case entschieden habe.
In meinem Fall liegen cs. 40 case Möglichkeiten vor. Das erschein mir übersichtlicher als eine wilde if-Konstruktion.

Verfasst: 28.05.2011, 13:32
von M4rco

Code: Alles auswählen

<?php

$item = "Auto";
$count = 1;
echo sprintf&#40;"Das ist mein %d %s", $count, $item&#41;;


Verfasst: 01.06.2011, 19:05
von m0dpad
Ganz easy. Wenn man ein einen genau definierten String hat den man matchen möchte, sollte man den regulären Ausdruck auch entsprechend formulieren.

Der Vorschlag:
preg_match("/.+-\d+$/", $string):

Würde auch andere Strings matchen, die das selbe Schema haben (z.B. 'srik-kopfman-sdsad-0112' würde genauso wie 'Rubrik-Name-0112' erkannt).

Code: Alles auswählen

$string = 'Rubrik-Name-0112';
$pattern = '/&#40;Rubrik-Name-&#41;&#91;0-9&#93;+/';
switch&#40;$string&#41; &#123;

 case &#40;bool&#41;preg_match&#40;$pattern, $string&#41; &#58;
	echo 'match in '.$string;
 break;
 default&#58;
	echo 'no match';
 break;	

&#125;