經與語法的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'