簡體   English   中英

PHP preg_split,僅保留整個正則表達式作為定界符,而忽略括號內的內容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM