在长字符串中搜索子模式


Search sub pattern in long string

下方有长字符串

$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];

请帮助我,或者任何关于这方面的好教程都将不胜感激。感谢您的反馈。

怎么样:

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是第1组
slot在第2组
第4组Port1
第3组中的Port2

试试这个,从$m 中查找1,2,3索引

$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
)

Regex的详细介绍可以在http://www.regular-expressions.info/您可以在这里测试您的正则表达式:http://regexpal.com/以及许多其他谷歌链接;)

如果字符串的末尾总是保持相同的长度,那么只需使用PHP的substr方法和-16(或者不管它有多少个字符)。

否则,您可以使用/([0-9/]+)+'':([0-9.]+)/之类的东西,然后解析出数据。

尝试使用:

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)