2016-11-26 16 views
0

変数からタグ間の複数の文字列を抽出して、スパンの内側に個別にエコーします。
事は、ここでは、問題のタグが変数によって決定されることになるようにそれが見えるものです:それはするpreg_matchを使用して私の最初の時間だと私はちょっと今迷ってしまいましたので、多くの貴様の事を試した後preg_matchを使用して1つの変数から複数の文字列を抽出します。

<?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> 
?> 


基本的に私は私のexemple $lang = "en_UK"にタグ[$lang]と[/ $lang](間に含まれるすべての文字列を抽出したいが、それは、ユーザーのクッキーによって決定されます。

私は場合は、これを考え出すいくつかの助けが欲しいです正規表現で可能な、

おかげ

+0

あなたの答えをありがとう、はい私はちょっと私の試みで失われました。あなたは$ langがあなたのコードで "en_UK"を出力すると思いますか?または、 'preg_match_all("/$ {lang。 "\](。+?)\ [\ /"。$ lang。 "\] /"、$ string、$ outputs_list)のようにエスケープする必要があります。 '?ありがとう! – eloism

+0

あなたは二重引用符で囲まれているので、どちらかが動作します。私は答えとしてそれを動かしました。 – chris85

答えて

1

[]character classになり、私はどちらかあなたが.秒で何をしようとしてわからないと,あなたの正規表現は、現在、言う:。。

任意の1文字、en_U、またはK,と空間、そして再び任意の単一文字、en_UKが、今回も/を許可します。

正規表現デモ:https://regex101.com/r/8pmy89/2

私はまた、あなたが間違った値をグループ化したと考えています。 ()は、キャプチャしたいものの周りにあり、capture groupとして知られています。

私はあなたがしたい正規表現があると思う:

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

正規表現のデモ:https://regex101.com/r/8pmy89/3

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_all("/\[$lang\](.+?)\[\/$lang\]/", $string, $outputs_list); 
foreach ($outputs_list[1] as $output) { 
    echo "<span>".$output."/span>"; 
} 

PHPのデモ:https://eval.in/686086

するpreg_match対preg_match_all

Preg_matchは、正規表現の最初の一致のみを返します。 Preg_match_allは、正規表現のすべての一致を返します。 0インデックスには完全正規表現と一致するものがあります。すべての後続のインデックスは、各キャプチャグループである。 1が最初のキャプチャグループです。

簡単なデモ:https://eval.in/686116

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

出力:

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

^は以下、preg_matchですが、私はこの答えを投稿する少し遅れて作ら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

ありがとうございます、これは現在機能しています。しかし、私は$ output_listの後の[1]が何を意味するのか理解していません。そして最後の質問は、私が元の質問に単純化するために追加していないことです:$ langの代わりに '$ user ['lang']'私はそれを特定の方法でエスケープする必要がありますか、私はこれのようにそれを残す? – eloism

+0

そしてあなたの答えを見分けるためのおかげで、実際に私のキャプチャグループは、基本的に私の試みではnullだった。 – eloism

+1

Preg_match_allは複数の一致を行い、1つのインデックスは最初のキャプチャグループです – chris85

1

です。 @chrisは既にあなたの質問に答えてくれました。私は解決策を広げ、さまざまな要件を持つ可能性のある他のユーザーを助けるかもしれません。

<?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

ユーザー言語-english1、english2、

すべての言語 - LANGのenglish1、english2、francais1、francais2、francais3、

タイプ - [en_UK ] [en_UK] [fr_FR] [fr_FR] [fr_FR]

+0

@ chris85、お手伝いをして、スタックオーバーフローを歓迎します。この回答または他の誰かがあなたの問題を解決した場合は、それを合格とマークしてください。他のユーザーに役立つでしょう –

関連する問題