在长字符串中搜索子模式

时间:2014-04-11 11:30:51

标签: php regex

我在

下面有长串
$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];

请帮助我或任何关于此的好教程将不胜感激。 感谢所有反馈。

4 个答案:

答案 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)