2017-02-08 5 views
2

Ich habe einen Pfad, der durch Schrägstrich getrennt ist. Dies wird greifen das letzte Wort in dem PfadGet Wort nach bestimmten Wort in Split-Array?

/user/john/account 

, 'Konto':

$uri = getenv('REQUEST_URI'); 
$uri = explode('/', $uri); 
$uri = array_filter($uri); 
$uri = array_merge($uri, array()); 

Der Weg etwas wie enden würde.

$uri = end($uri); 

Wie kann ich das erste Wort nach 'Benutzer' in eine Variable finden?

In diesem Fall wäre es "John", aber der Name kann sich bei jedem neuen URI ändern.

"Benutzer" bleibt immer das gleiche Wort.

+0

Wenn Sie URL-Rewriting verwenden, dann wäre dies nicht notwendig zu teilen. http://StackOverflow.com/Questions/16388959/url-rewriting-with-php – Noman

Antwort

3
$uri = "/user/john/account"; 
$uri_array = explode("/", $uri); 
$key = array_search("user", $uri_array); 
$desired_value = array_key_exists($key+1, $uri_array) ? $uri_array[$key+1] : "error"; 
echo $desired_value; 

Hier ist, was Sie brauchen: Hinweis: „user“ ist ein fester Begriff in array_search .. Sie können es ändern

+0

Hallo, ich versuche, Ihre Lösung zu implementieren.Ich fand ein kleines Problem, wenn der Pfad nicht abgeschlossen ist "/ Benutzer" ohne "John" und $ Schlüssel + 1, wird es einen Fehler werfen. –

+0

Entschuldigung es ist mein Fehler .. es ist immer gut zu überprüfen, ob Array-Schlüssel existieren –

+0

Es funktioniert jetzt in einem Test. Es wird eine Weile dauern, bis die Seiten eingerichtet sind, und ich melde mich bei Ihnen und akzeptiere Ihre Antwort. Vielen Dank. –

1

Vor $ uri = end ($ uri) fügen Sie diese:

$uriArray = explode('/',$uri); //$uriArray[0] = 'user' //$uriArray[1] = 'john' 

$name = $uriArray[1]; 

Damit Sie auch das letzte Element nach einem Schrägstrich

EDIT bekommen konnte: Sie auch preg_split verwenden könnte ("Muster ', $ string) wie folgt:

$name = preg_split('user/',$uri); 

$ name wäre "john/account". Dann wieder verwenden explodieren, es in ein Array zu speichern, Element 0 ist der Name

+0

hatte ich eigentlich schon mal benutzt, es wählt eine Position aus, die ich aber nach einem bestimmten Wort brauche. Es kann immer noch nützlich sein, danke. –

+0

hinzugefügt alternative Lösung, vielleicht kann dies Ihnen helfen – bloodscript

2

Edit: Verwenden M A SIDDIQUIs beantwortet es der bessere Weg ist, dieses Problem

lösen Sie eine Funktion für diese schreiben können, die herausfindet, whitch Position des uri-Array user das Wort enthält, und gibt dann die nächste Position das sollte enthält den Namen.

function getName($uri) 
{ 
    $uri = explode('/', $uri); 
    for($i = 0; $i < sizeof($uri); $i++){ 
     if($uri[$i] == "user"){ 
      return $uri[$i+1]; 
     } 
    } 
} 

Dann müssen Sie es nur mit ausdrucken:

echo getName("exmaple/user/username/etc"); 
+0

Danke, viele gute Antworten. Lass mich sie testen und zu dir zurückkommen. –

1

du

$uri='/user/john/account'; 
$from1 ='/user/'; 
$to1 ='/'; 
//$uri = explode('/', $uri); 

echo get_string_between($uri,$from1,$to1); 

function get_string_between ($str,$from,$to) { 
    $string = substr($str, strpos($str, $from) + strlen($from)); 
    if (strstr ($string,$to,TRUE) != FALSE) { 
     $string = strstr ($string,$to,TRUE); 
    } 
    return $string; 
} 
1

preg_match verwenden können möglicherweise effizienter in diesem Fall:

Psy Shell v0.8.1 (PHP 7.1.1-1+deb.sury.org~xenial+1 — cli) by Justin Hileman 
>>> preg_match('~/user/([^/]+)/?~', '/test/user/username/tuedelue', $matches); 
=> 1 
>>> $matches; 
=> [ 
    "/user/username/", 
    "username", 
    ] 
>>> $matches[1]; 
=> "username" 
>>> | 

Also diese Zeilen

$user = 'unknown'; 
if (preg_match('~/user/([^/]+)/?~', getenv('REQUEST_URI'), $matches)) { 
    $user = $matches[1]; 
} 

würde Ihr Problem lösen.

+0

Das funktioniert gut, aber wenn ich es auf einer Seite ausführen, die/user/nicht enthält, wird es einen Fehler geben. Gibt es einen Weg dahin? –

+0

@MattMcManis siehe mein bearbeitetes Beispiel. –

+0

Wie viel schneller/Licht auf Ressource denken Sie, das ist als M A SIDDIQUI's Lösung? http://stackoverflow.com/a/42110367/6806643 –

Verwandte Themen