经与语法的preg_matchpreg_match_all语法问题
麻烦?
喜欢的东西
$regex = '/(?="|>)http:\/\/www.(.*?)/(.*?)(?"|\<)/';
对不起不是在这个非常好。
经与语法的preg_matchpreg_match_all语法问题
麻烦?
喜欢的东西
$regex = '/(?="|>)http:\/\/www.(.*?)/(.*?)(?"|\<)/';
对不起不是在这个非常好。
这看起来对我的权利:
/(?:="|>)http:\/\/www\.(.*?)\/(.*?)["<]/i
注意一些小的修正:你非捕获组语法是有点过(它应该是(?:pattern)
代替(?pattern)
),你还需要逃跑.
和/
。
我也不确定(.*?)\/(.*?)
是否完全符合您的想法;除非你想要求/
这个字符,否则我可能会用(.*?)
替换它。
这是一个有趣的想法。
使用/(?:(=")|>)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'