2016-11-26 3 views
0

Ich habe Probleme beim Extrahieren mehrerer Zeichenfolgen zwischen Tags aus einer Variablen, um sie innerhalb eines Bereichs einzeln zu echo.
Das Ding ist, werden die Tags in Frage durch eine Variable bestimmt, hier ist, wie es aussieht:Extrahieren Sie mehrere Strings aus einer Variablen mit preg_match

<?php 
    $string = "[en_UK]english1[/en_UK][en_UK]english2[/en_UK][fr_FR]francais1[/fr_FR][fr_FR]francais2[/fr_FR][fr_FR]francais3[/fr_FR]"; 
    $lang = "en_UK"; 

    preg_match("/(.[$lang]), (.[\/$lang])/", $string, $outputs_list); 

    foreach ($outputs_list as $output) { 
     echo "<span>".$output."/span>"; 
    } 

    // in this exemple I want to output : 
    // <span>english1</span> 
    // <span>english2</span> 
?> 

Es ist mein erstes Mal mit preg_match und nach dem Versuch, so viele differents Dinge, die ich irgendwie verloren bin in diesem Augenblick.
Grundsätzlich möchte ich alle Saiten zwischen den Tags [$lang] und [/ $lang] (in meinem exemple $lang = "en_UK" aber es wird durch die Benutzer-Cookies bestimmt werden.

Ich möchte etwas Hilfe Bezifferung dieses heraus enthalten extrahieren, wenn möglich,

Dank

+0

Danke für deine Antwort, ja ich bin irgendwie in meinen Versuchen verloren gegangen. Wie auch immer, denkst du, dass $ lang "en_UK" in deinem Code ausgeben wird? Oder muss ich es wie 'preg_match_all (" /\[".$ lang. "\] (. +?) \ [\ /". $ Lang. "\] /", $ String, $ outputs_list); '? Vielen Dank ! – eloism

+0

Entweder oder wird funktionieren, da Sie in Anführungszeichen stehen. Ich habe das als Antwort verschoben. – chris85

Antwort

1

[] in einem regulären Ausdruck macht ein character class ich bin nicht sicher, was Sie versuchen, mit dem . s und , entweder zu tun Ihren regex zur Zeit sagt:..

Ein einzelnes Zeichen, ein e, n, _, U oder K, ein , und Raum, und wieder jedes einzelne Zeichen, ein e, n, _, U, K, aber diesmal auch / ermöglicht.

Regex Demo: https://regex101.com/r/8pmy89/2

Ich glaube auch, wurden Sie den falschen Wert zu gruppieren. Die () gehen herum, was Sie erfassen möchten, wissen Sie als capture group.

Ich denke, die regex Sie wollen, ist:

\[$lang\](.+?)\[\/$lang\] 

Regex Demo: https://regex101.com/r/8pmy89/3

PHP Verbrauch:

$string = "[en_UK]english1[/en_UK][en_UK]english2[/en_UK][fr_FR]francais1[/fr_FR][fr_FR]francais2[/fr_FR][fr_FR]francais3[/fr_FR]"; 
$lang = "en_UK"; 
preg_match_all("/\[$lang\](.+?)\[\/$lang\]/", $string, $outputs_list); 
foreach ($outputs_list[1] as $output) { 
    echo "<span>".$output."/span>"; 
} 

PHP Demo: https://eval.in/686086

Preg_match vs. preg_match_all

Preg_match gibt nur die erste Übereinstimmung einer Regex zurück. Preg_match_all gibt alle Übereinstimmungen der Regex zurück. Die 0 Index hat, was die volle Regex abgestimmt. Alle nachfolgenden Indizes sind jeweils Erfassungsgruppen, z.B. 1 ist die erste Erfassungsgruppe.

Einfache Demo: https://eval.in/686116

$string = '12345'; 
preg_match('/(\d)/', $string, $match); 
print_r($match); 
preg_match_all('/(\d)/', $string, $match); 
print_r($match); 

Ausgang:

Array 
(
    [0] => 1 
    [1] => 1 
) 

^ist preg_match, unten ist die preg_match_all

Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 3 
      [3] => 4 
      [4] => 5 
     ) 

    [1] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 3 
      [3] => 4 
      [4] => 5 
     ) 

) 
+0

Danke, das funktioniert jetzt. Allerdings verstehe ich nicht, wofür die [1] nach $ outputs_list steht? Und eine letzte Frage, die ich meiner ursprünglichen Frage nicht hinzugefügt habe, um die Dinge zu vereinfachen: Wenn ich statt $ lang '$ user ['lang']' brauche, muss ich auf eine bestimmte Art und Weise entkommen, oder wird es funktionieren, wenn Ich verlasse es so? – eloism

+0

Und danke, dass du deine Antwort so genau beschrieben hast, meine Fanggruppe war in meinem Versuch im Grunde Null. – eloism

+1

Preg_match_all macht mehrere Übereinstimmungen, die 1 Index ist die erste Erfassungsgruppe – chris85

1

ich etwas zu spät gemacht diese Antwort zu schreiben. @chris hat Ihre Frage bereits beantwortet, also habe ich die Lösung weit gefasst, um anderen Benutzern zu helfen, die möglicherweise andere Anforderungen haben.

<?php 
$string = "[en_UK]english1[/en_UK][en_UK]english2[/en_UK][fr_FR]francais1[/fr_FR][fr_FR]francais2[/fr_FR][fr_FR]francais3[/fr_FR]"; 
$lang = "en_UK"; 
echo "User Language -"; 
preg_match_all("/\[$lang\](.+?)\[\/$lang\]/", $string, $outputs_list); 
foreach ($outputs_list[1] as $output) { 
    echo "<span>".$output.",</span>"; 
} 
echo "<br/>All languages - "; 
//if all lang 
preg_match_all("/[a-zA-Z0-9]{3,}/", $string, $outputs_list); 
foreach ($outputs_list[0] as $output) { 
    echo "<span>".$output.",</span>"; 
} 
echo "<br/>Type of lang - "; 
//for showing all type of lang 
preg_match_all("/(\[[a-zA-Z_]+\])*/", $string, $outputs_list); 
foreach ($outputs_list[1] as $output) { 
    echo "<span>".$output."</span>"; 
} 
?> 

OUTPUT

User Language -english1, Englisch 2,

alle Sprachen - Englisch 1, Englisch 2, francais1, francais2, francais3,

Typ lang - [en_UK ] [en_DE] [fr_FR] [fr_FR] [fr_FR]

+0

@ chris85, glücklich zu helfen, und willkommen zu Stack Overflow. Wenn diese Antwort oder eine andere Lösung Ihr Problem behoben hat, markieren Sie es als akzeptiert. Es wird anderen Benutzern hilfreich sein –

Verwandte Themen