2016-02-28 79 views
2

試圖搜索已經回答的問題,但...找不到任何東西。 我試圖做一個正則表達式將匹配IPv4或IPv4的:端口REGEX:無條件匹配

$regex_ipv4 = '((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?![\\d])'; 
$regex_integer = '(\\d+)'; 

$x = "123.123.123.123"; 
$x2 = $x . ":12345"; 

preg_match("/^(?<ipv4>".$regex_ipv4.")(:)(?<port>".$regex_integer.")$/is", $x, $matches1); 
preg_match("/^(?<ipv4>".$regex_ipv4.")(:)(?<port>".$regex_integer.")$/is", $x2, $matches2); 

print_r($matches1); 
print_r($matches2); 

回報:

Array 
(
) 
Array 
(
    [0] => 123.123.123.123:12345 
    [ipv4] => 123.123.123.123 
    [1] => 123.123.123.123 
    [2] => 123.123.123.123 
    [3] => : 
    [port] => 12345 
    [4] => 12345 
    [5] => 12345 
) 

我怎樣才能使(:)(?<port>".$regex_integer.")無條件的比賽?

謝謝!

+1

什麼你的意思是「無條件地匹配......」嗎? –

+0

'((:)(?「。$ regex_integer。」))?'? –

+0

看起來代碼正在工作,命名組捕獲你所需要的。 –

回答

1

您必須在模式結尾處搜索可選組。它可以是這樣的:

^(?<ipv4>((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?!\d))(?::(?<port>\d+))?$ 

regex demo

在你的代碼,使用

preg_match("/^(?<ipv4>".$regex_ipv4.")(?::(?<port>".$regex_integer."))?$/", $x, $matches); 

注意,一個:周圍捕獲組是多餘的。 (?:開始非捕獲組,)?在正則表達式關閉組和?量詞使正則表達式引擎匹配該組1或0次。

而且清理正則表達式模式,我建議刪除多餘的字符類只是一個符號和多餘的捕捉組:

$regex_ipv4 = "((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?!\\d)"; 
$regex_integer = "\\d+"; 

這裏是一個complete PHP demo

$regex_ipv4 = "((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?!\\d)"; 
$regex_integer = "\\d+"; 

$x = "123.123.123.123"; 
$x2 = $x . ":12345"; 

preg_match("/^(?<ipv4>".$regex_ipv4.")(?::(?<port>".$regex_integer."))?$/", $x, $matches); 
preg_match("/^(?<ipv4>".$regex_ipv4.")(?::(?<port>".$regex_integer."))?$/", $x2, $matches2); 

print_r($matches); 
print_r($matches2); 
+0

謝謝!成功了! – user3405598