在PHP中,我想從字符串中提取字符串Nickname
:to[Nickname]
。PHP,解析出方括號內的字符串
我試過使用preg_split()
但沒有成功。
更新
如何將我使其從提取物,雖然 「爲[暱稱]」? 「目標」 括號之前也有點重要,因爲它標識了 樣的信息的用戶發送
在PHP中,我想從字符串中提取字符串Nickname
:to[Nickname]
。PHP,解析出方括號內的字符串
我試過使用preg_split()
但沒有成功。
更新
如何將我使其從提取物,雖然 「爲[暱稱]」? 「目標」 括號之前也有點重要,因爲它標識了 樣的信息的用戶發送
您可以使用正則表達式來從內部[]
括號
"/\[(.*?)\]/"
提取文本我不知道哪個preg_match()
/preg_match_all()
是在這裏使用的正確的,所以我只給你應該工作的模式,並讓你通過查找功能差異來了解其餘模式。
從評論
preg_match("/to\[(.*?)\]/", $message, $nickname);
您可以使用正則表達式,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;
我寧願學習正則表達式,也不願爲每個匹配的字符串編寫解析器。但我喜歡多樣性,很好+1。 – HamZa
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
作爲key
和detail
作爲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
如何將我使其從中提取「到[暱稱]「,但?括號之前的「to」也很重要,因爲它標識了用戶發送什麼樣的消息 – mrPowers
好吧,您剛剛添加了另一個要求。返回值是否需要根據「to」或「from」等標識符進行更改? – JLewkovich
@NickoMrPowersRusski如果是這種情況,您需要提供更多信息。例如,應該在這裏匹配'lol | to'[暱稱] | lol'?這是正則表達式,你需要**精確** – HamZa