我正在尝试在字符串上使用更复杂的正则表达式和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正则表达式,有很多括号,我担心只用一组括号几乎不可能重写外。任何人都可以帮我吗?我非常感激。或者,如果我失去了一种完全不同于我的目的的手段,请随意指出我的方向。
答案 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是我用于将格式应用于传递给它的数组的第一个元素的方法。简单。我只需重新使用此代码段并更改正则表达式和格式化方法,就可以为代码添加更多格式选项。