2016-11-26 49 views
0

我有麻煩提取變量之間的標記之間的幾個字符串,以便單獨在一個範圍內回顯它們。
事情是,有問題的標籤是由一個變量決定的,這裏是什麼樣子:通過使用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> 
?> 

這是使用的preg_match我第一次和嘗試這麼多型動物的事情我有點失去了,現在後。
基本上我想包含在標籤[$lang]和[/ $lang](在我爲例$lang = "en_UK",但它會在用戶的cookie確定之間的每一個字符串中提取。

我想一些幫助搞清楚了這一點,如果可能的話,

感謝

+0

謝謝你的回答,是的,我有點迷失在我的嘗試中。你怎麼認爲$ lang會在你的代碼中輸出「en_UK」?或者我需要像'preg_match_all(「/\[".$ lang。」\](。+?)\ [\ /。。$ lang。「\] /」,$ string,$ outputs_list); '?謝謝 ! – eloism

+0

因爲你使用雙引號,所以或者會工作。我已經把它作爲一個答案。 – chris85

回答

1

正則表達式[]使得character class我不知道你想與. S和,做任何你的正則表達式現在說:。

任何單個字符,一個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

謝謝,這現在正在工作。不過,我不明白$ outputs_list後面的[1]是什麼意思?還有一個最後的問題,我沒有添加到我原來的問題來簡化事情:如果不是$ lang,我有'$ user ['lang']'我需要以特定的方式逃避它,還是它會工作如果我是這樣離開的嗎? – eloism

+0

謝謝你儘可能多地回答你的答案,實際上我的捕獲組在我的嘗試中基本上是空的。 – 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>"; 
} 
?> 

輸出

用戶語言-english1,english2,

所有語言 - english1,english2,francais1,francais2,francais3,郎

類型 - [en_UK ] [en_UK] [fr_FR] [fr_FR] [fr_FR]

+0

@ chris85,樂於幫助,並歡迎來到Stack Overflow。如果此答案或任何其他人解決了您的問題,請將其標記爲已接受。這對其他用戶會有幫助 –

相關問題