2011-04-14 39 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'