这是一个小而实用的 Perl 代码片段:
my $content = qq{<img src='h};
if ($content =~ m{src=(?!('*)http://)}) {
print "Match '$1'\n";
}
else {
print "No match\n";
}
它打印
Match '''
那就是负前瞻中的正则表达式('*)确实已被捕获并包含'。
但是,如果我将第一行替换为
my $content = qq{<img src='i};
脚本打印
Match ''
意味着尽管整个正则表达式匹配,但 ' 尚未被捕获。
任何人都可以解释有什么区别以及我怎样才能做到这一点,以便 ' 总是被捕获(这当然是一个真实案例的简化)。
提前致谢
附录
这就是raina77ow 的全部内容。想法是替换img标签中src属性的内容。以下规则适用:
- 如果内容以 ' 开头,则必须以 ' 结尾。
- 如果内容以 " 开头,则必须以 " 结尾。
- 内容可以不加引号。
- 如果内容(可能的引用之后)以 http:// 开头,则应保持原样,否则 URL 的最后一个组成部分(图像文件名)必须保留,并且前面的部分必须替换为 smth。
最初我想使用以下正则表达式(实际上与您建议的相同)
$content =~ s{<\s*img\s+(.*?)src\s*=\s*(["']*)(?!http://).*?([^/"']+)\2(\s+[^>]+)*>}
{'<img ' . $1 . 'src="' . 'SMTH' . $3 . '"' . $4 . '>'}sgie;
但由于某种原因,它与字符串匹配
[img src=' http: //qq.com/img.gif'/ ]
(尖括号替换为方括号)。
虽然它不应该因为 ' 后跟 http://。使用
$content =~ s{<\s*img\s+(.*?)src\s*=\s*(["'])*(?!http://).*?([^/"']+)\2(\s+[^>]+)*>}
{'<img ' . $1 . 'src="' . 'SMTH' . $3 . '"' . $4 . '>'}sgie;
也是不合适的,因为在这种情况下 \2 将不匹配空字符串。
无法解决这个问题,我决定寻找一些解决方法。唉...