preg_match_all语法问题

时间:2011-04-14 14:20:15

标签: php regex preg-match-all

使用preg_match语法时遇到问题

在页面中我需要找到类似

的内容
$first = '/>http:\/\/www.(.*?)\/(.*?)\</';
$second = '/="http:\/\/www.(.*?)\/(.*?)"/';

我怎么能把两者合并?

这样的东西
$regex = '/(?="|>)http:\/\/www.(.*?)/(.*?)(?"|\<)/';

抱歉不是很擅长这个。

2 个答案:

答案 0 :(得分:0)

这看起来对我来说是正确的:

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

请注意一些小的更正:您的非捕获组语法稍微偏离(它应该是(?:pattern)而不是(?pattern)),您还需要转义./

我也不确定(.*?)\/(.*?)是否正在按照您的想法行事;除非您想要(.*?)个字符,否则我可能会将其替换为/

答案 1 :(得分: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'