我在
下面有长串$raw = "bk-pon@huawei-bangrak-fl5.bangkok xpon 0/3/0/1:4.1.3499"
我希望得到以下子字符串
$Slot = "0/3/0" <- space_value1_slash_value2_slash_value3
$Port1 = 1 <- the number between last slash and :
$Port2 = 1:4:1.3499 <- the value after last slash until end of string or until found space
如何编写PHP来解压缩$ slot,$ port和$ port2? 我认为PHP代码应如下所示,但我不知道如何在xxx,yyy和zzz中编写正则表达式,
$raw = "bk-pon@huawei-bangrak-fl5.bangkok xpon 0/3/0/1:4.1.3499";
$pattern_slot="xxxxxx";
$pattern_port1="yyyyyy";
$pattern_port2="zzzzzzz";
preg_match_all($pattern_slot, $raw, $slot);
preg_match_all($pattern_port1, $raw, $port1);
preg_match_all($pattern_port2, $raw, $port2);
echo "<br> Slot = ".$slot[0][0];
echo "<br> Port1 = ".$port1[0][0];
echo "<br> Port2 = ".$port2[0][0];
请帮助我或任何关于此的好教程将不胜感激。 感谢所有反馈。
答案 0 :(得分:1)
怎么样:
preg_match('#\s(\d+/\d+/\d+)/((\d+):\d+\.\d+\.\d+)$#', $string, $matches);
// group 1 ^___________^ || | |
// group 3 |^___^ |
// group 2 ^___________________^
slot
在第1组中
第3组Port1
第2组Port2
组号由左括号的数量定义。
根据评论进行编辑:
preg_match('#^(\S+)\s\w+\s(\d+/\d+/\d+)/((\d+):\d+\.\d+\.\d+)$#', $string, $matches);
email
是i组1
slot
在第2组中
第4组Port1
第3组Port2
答案 1 :(得分:1)
试试这个,然后从1,2,3
$m
索引
$raw = "bk-pon@huawei-bangrak-fl5.bangkok xpon 0/3/0/1:4.1.3499";
preg_match('~(\d+/\d+/\d+)/(?=(\d+))(.*)~', $raw, $m);
print_r($m);
输出:
Array
(
[0] => 0/3/0/1:4.1.3499
[1] => 0/3/0
[2] => 1
[3] => 1:4.1.3499
)
答案 2 :(得分:1)
可以在http://www.regular-expressions.info/上找到有关正则表达式的精彩介绍,您可以在此处测试您的正则表达式:http://regexpal.com/以及许多其他Google链接;)
如果你的字符串结尾始终保持相同的长度,那么只需使用PHP的substr
方法和-16(或者它是多少个字符)。
否则你可以使用像/([0-9 /] +)+ \ :( [0-9.]+)/这样的东西然后解析数据。
答案 3 :(得分:1)
尝试:
preg_match('~(\d+/\d+/\d+)/((\d+):[^ ]*)~', $raw, $matches);
list(, $slot, $port2, $port1) = $matches;
输出:
// slot
string '0/3/0' (length=5)
// port1
string '1' (length=1)
// port2
string '1:4.1.3499' (length=10)