[英]PHP preg_split and keeping only the entire regex as a delimiter, ignoring inside parentheses
我試圖在字符串上使用更復雜的正則表達式和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正則表達式,而且恐怕幾乎不可能只用一組括號來重寫外。 有人可以幫我嗎? 我將不勝感激。 或者,如果有一種完全不同的方法讓我想念我,請隨時指出我的方向。
您可以通過在圓括號后面添加?:
來取消括號捕獲,例如:
((?:(?:\d{1,3})\.){3}(?:\d{1,3}))
我設法減少了方法的整體混亂,並改進了它,使其僅使用幾行代碼:
if (preg_match($ipv4regex, $line)){
$line = preg_replace_callback($ipv4regex, 'add_ipv4_p', $line);
}
然后,我稍后再打印該行,但這只是我進行正則表達式檢查所需的全部內容。add_ipv4_p方法是我用來將格式應用於傳遞給它的數組的第一個元素的方法。 簡單。 通過重新使用此代碼段並更改正則表達式和格式設置方法,我能夠為代碼添加更多格式設置選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.