使用preg_match语法时遇到问题
在页面中我需要找到类似
的内容$first = '/>http:\/\/www.(.*?)\/(.*?)\</';
$second = '/="http:\/\/www.(.*?)\/(.*?)"/';
我怎么能把两者合并?
像
这样的东西$regex = '/(?="|>)http:\/\/www.(.*?)/(.*?)(?"|\<)/';
抱歉不是很擅长这个。
答案 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'