2013-08-18 155 views
0

在PHP中,我想從字符串中提取字符串Nicknameto[Nickname]PHP,解析出方括號內的字符串

我試過使用preg_split()但沒有成功。

更新

如何將我使其從提取物,雖然 「爲[暱稱]」? 「目標」 括號之前也有點重要,因爲它標識了 樣的信息的用戶發送

回答

2

您可以使用正則表達式來從內部[]括號

"/\[(.*?)\]/"

提取文本我不知道哪個preg_match()/preg_match_all()是在這裏使用的正確的,所以我只給你應該工作的模式,並讓你通過查找功能差異來了解其餘模式。

從評論

preg_match("/to\[(.*?)\]/", $message, $nickname); 
+0

如何將我使其從中提取「到[暱稱]「,但?括號之前的「to」也很重要,因爲它標識了用戶發送什麼樣的消息 – mrPowers

+0

好吧,您剛剛添加了另一個要求。返回值是否需要根據「to」或「from」等標識符進行更改? – JLewkovich

+0

@NickoMrPowersRusski如果是這種情況,您需要提供更多信息。例如,應該在這裏匹配'lol | to'[暱稱] | lol'?這是正則表達式,你需要**精確** – HamZa

2

您可以使用正則表達式,strpos的一些組合,或者你可以自己解析它更新。我更喜歡大部分時間自己解析字符串,但在PHP中,最快的解決方案通常使用strxxx函數。正則表達式也可以很快,但對於複雜的情況很難編寫,很難閱讀,也很難調試。下面是一些代碼來分析您的字符串(請注意,包括逃避「]」字符邏輯):

$input = 'to[somevalue]'; 
$length = strlen($input); 

for($start = 0; $start < $length; $start++) 
{ 
    $char = $input[$start]; 

    if($char == '[') 
    { 
     $start++; 
     break; 
    } 
} 

$out = ''; 
$escaped = false; 

for($i = $start; $i < $length; $i++) 
{ 
    $char = $input[$i]; 

    if($char == '\\') 
    { 
     $escaped = true; 
     continue; 
    } 

    if($escaped == false && $char == ']') 
    { 
     break; 
    } 

    if($escaped == true) 
    { 
     $escaped = false; 
    } 

    $out .= $char; 
} 

echo $out; 
+0

我寧願學習正則表達式,也不願爲每個匹配的字符串編寫解析器。但我喜歡多樣性,很好+1。 – HamZa

2

preg_match()preg_split()更適合此。我在這裏使用look-arounds。正面後視(?<=[[])左側支架[。任何不是右支架一次或多次的東西[^]]+和右支架(?=[]])的積極預見。 !是我選擇的分隔符。

<?php 
    $string = "to[Nickname]"; 
    $pattern = "!(?<=[[])[^]]+(?=[]])!"; 
    preg_match($pattern,$string,$match); 

    print($match[0]); 
?> 

輸出

Nickname 

更新

在它的外觀等問題,一個看上去象你也想抓住這句話的 「to」 部分。

<?php 
$string = "to[Nickname] 
from[Bob] 
subject[This is what the message is about]"; 

    $pattern = "!([^[]+)\[([^]]+)\][\n\r]+!"; 
    preg_match_all($pattern,$string,$matches); 

    print_r($matches); 
?> 

它輸出這樣的:

Array 
(
    [0] => Array 
     (
      [0] => to[Nickname] 

      [1] => from[Bob] 

     ) 

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

    [2] => Array 
     (
      [0] => Nickname 
      [1] => Bob 
     ) 

) 

所以要使用這些變量從這個例子中,我們可以將它們存儲在一個數組是有道理的。在這裏我將創建一個名爲的數組,我們將action作爲keydetail作爲value

foreach($matches[1] as $key=>$value){ 
    $actions[$matches[1][$key]]=$matches[2][$key]; 
} 

使用數組,您只需將遍歷它像這樣的價值觀:

foreach($actions as $action=>$detail){ 
    echo $action."=".$detail."\n"; 
} 

更新的輸出

to=Nickname 
from=Bob 
+0

_sad fact_:他想要'[暱稱]'作爲輸出... – HamZa

+0

@HamZa噢,真好。 –

+1

@AbsoluteƵERØ:什麼? –