2011-04-14 94 views
0

經與語法的preg_matchpreg_match_all語法問題

麻煩?

喜歡的東西

$regex = '/(?="|>)http:\/\/www.(.*?)/(.*?)(?"|\<)/'; 

對不起不是在這個非常好。

回答

0

這看起來對我的權利:

/(?:="|>)http:\/\/www\.(.*?)\/(.*?)["<]/i 

注意一些小的修正:你非捕獲組語法是有點過(它應該是(?:pattern)代替(?pattern)),你還需要逃跑./

我也不確定(.*?)\/(.*?)是否完全符合您的想法;除非你想要求/這個字符,否則我可能會用(.*?)替換它。

0

這是一個有趣的想法。

使用/(?:(=")|>)http:\/\/www\.(.*?)\/(.*?)(?(1)"|<)/sg使用循環查找下一個搜索。每次提取變量$ 2和$ 3。這使用一個條件。

或者,使用/(?|(?<==")http:\/\/www\.(.*?)\/(.*?)(?=")|(?<=>)http:\/\/www\.(.*?)\/(.*?)(?=<))/sg進行比賽。這使用分支重置。該數組將以對($ cnt ++%2)形式累積。

取決於你的意思合併。

一個Perl測試用例:

use strict; 
use warnings; 

my $str = ' 
<tag asdf="http://www.some.com/directory"/> 
<dadr>http://www.adif.com/dir</dadr> 
'; 

while ($str =~ /(?:(=")|>)http:\/\/www\.(.*?)\/(.*?)(?(1)"|<)/sg) 
{ 
    print "'$2' '$3'\n"; 
} 
print "--------------\n"; 

my @parts = $str =~ /(?|(?<==")http:\/\/www\.(.*?)\/(.*?)(?=")|(?<=>)http:\/\/www\.(.*?)\/(.*?)(?=<))/sg; 
my $cnt = 0; 

for (@parts) 
{ 
    print "'$_' "; 
    if ($cnt++ % 2) { 
     print "\n"; 
    } 
} 
__END__ 

輸出:

'some.com' 'directory' 
'adif.com' 'dir' 
-------------- 
'some.com' 'directory' 
'adif.com' 'dir'