2012-08-29 11 views
1

我想在字符串上使用更復雜的正則表達式和preg_split來獲取所有匹配的數組並保留分隔符。通常情況下,這很簡單,但試圖使用PREG_SPLIT_DELIM_CAPTURE並且在我的正則表達式中使用多組括號會證明是困難的。我將詳細說明:PHP preg_split和只保留整個正則表達式作爲分隔符,忽略括號內

我想解析一行中的IP地址並將整行分解爲一個數組,以便我可以專門做一些只有IP的事情,但我最終要顯示整行(我' m將格式應用於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

可以desactivate括號僅由開括號後加入?:捕捉,例如:

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

這非常有用,謝謝! – Skyline969

+0

不客氣:)(不要忘記標記問題爲答案) – Oussama

+0

不幸的是,我解決了它不同的方式,但我不能回答我的問題一個小時左右。這種方式可行,但這不是我解決問題的方法。 – Skyline969

0

我設法降低方法的整體雜波和提高其使用的代碼只有幾行:

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

然後我打印線以後,但這個簡單的位爲所有我需要正則表達式檢查 方法add_ipv4_p是我使用格式設置應用到陣列通的第一元件的製造方法編輯它。簡單。我可以通過重新使用此代碼段並更改正則表達式和格式化方法來爲代碼添加更多格式選項。

相關問題