PHP preg_split并仅将整个正则表达式保留为分隔符,忽略括号内部

时间:2012-08-29 15:15:08

标签: php regex preg-split

我正在尝试在字符串上使用更复杂的正则表达式和preg_split来获取所有匹配的数组并保留分隔符。通常情况下这很简单,但尝试使用PREG_SPLIT_DELIM_CAPTURE并在我的正则表达式中使用多组括号被证明是困难的。我会详细说明:

我想在一行中解析一个IP地址并将整行拆分成一个数组,这样我就可以只用IP来做一些事情,但我想最终显示整行(我正在应用格式化到IP然后重新组装并显示字符串)。我的正则表达式是这个(它检查看起来像IP的东西,但它不检查有效性,我现在不在乎):

(((\d{1,3})\.){3}(\d{1,3}))

现在,我的代码暂时是这样的:     $ ipv4regex =“/(((\ d {1,3})。){3}(\ d {1,3}))/”;

if (contains_ipv4($line)){
    $pieces = preg_split($ipv4regex, $line, 0, PREG_SPLIT_DELIM_CAPTURE);
    print "<pre>";
    print_r($pieces);
    print "</pre>";
}

function contains_ipv4($val){
    return (preg_match($ipv4regex, $val));
}

以下是我输出的示例(IP地址已更改,但仍然相关):

Array
(
    [0] => show arp results from 
    [1] => 10.10.15.120
    [2] => 15.
    [3] => 15
    [4] => 120
    [5] => 
)

如何更改它以使输出如下:

(
    [0] => show arp results from 
    [1] => 10.10.15.120
    [2] => 
)

基本上我想只捕获我的正则表达式中PREG_SPLIT_DELIM_CAPTURE的最外面的括号,而不是内部的括号。我知道我可以为这个特殊情况更改我的正则表达式,但是我有一个“正确的”IPv6正则表达式,有很多括号,我担心只用一组括号几乎不可能重写外。任何人都可以帮我吗?我非常感激。或者,如果我失去了一种完全不同于我的目的的手段,请随意指出我的方向。

2 个答案:

答案 0 :(得分:0)

您可以在打开括号后添加?:来停用括号捕获,例如:

((?:(?:\d{1,3})\.){3}(?:\d{1,3}))

答案 1 :(得分:0)

我设法减少了方法的整体混乱,并改进了它只使用几行代码:

if (preg_match($ipv4regex, $line)){
    $line = preg_replace_callback($ipv4regex, 'add_ipv4_p', $line);
}

然后,我稍后打印该行,但这个简单的位是我需要的正则表达式检查 方法add_ipv4_p是我用于将格式应用于传递给它的数组的第一个元素的方法。简单。我只需重新使用此代码段并更改正则表达式和格式化方法,就可以为代码添加更多格式选项。