【问题标题】:Matching Src attributes that don't begin with HTTP [closed]匹配不以 HTTP 开头的 Src 属性 [关闭]
【发布时间】:2012-06-28 14:39:12
【问题描述】:

我正在尝试匹配所有不以http 开头的src 属性。

【问题讨论】:

标签: perl


【解决方案1】:

您希望将 URI 解析为绝对 URI。使用强大的 HTML 解析器:

use strictures;
use URI qw();
use Web::Query 'wq';

my $PATH_BLAH = 'http://example.com/blah/';
my $html = <<'HTML';
<html><head></head><body>
<img src="../relative-link" />
<img src="yup/another/one" />
<img src="/oh/I/start/with/a/slash" />
<img src="http://example.net/absolute-link" />
</body></html>
HTML

my $w = wq $html;
$w->find('*[src]')->each(sub {
    my (undef, $e) = @_;
    $e->attr('src', URI->new_abs($e->attr('src'), $PATH_BLAH));
});
print $w->html;

__END__
<html><head></head><body>
<img src="http://example.com/relative-link" />
<img src="http://example.com/blah/yup/another/one" />
<img src="http://example.com/blah/oh/I/start/with/a/slash" />
<img src="http://example.net/absolute-link" />
</body></html>

【讨论】:

    【解决方案2】:

    这不是“非”运算符。那是“行首”锚字符。

    s!^(?!http)/?!$PATH_BLAH/! 之类的内容可能正是您想要的。

    【讨论】:

    • +1:很好地解决问题的含义!
    • 关于这个问题,daxim 的解决方案应该处理的是协议相对路径。例如,如果我有&lt;img src="//images.example.com/foo.png"&gt;,那么如果页面是通过 http 提供的,那么绝对 URL 应该变成 http://images.example.com/foo.png。通过 https 提供的相同文件将导致 https://images.example.com/foo.png。如果您预先生成必须同时提供给未登录用户 (http) 和登录用户 (https 以保护 cookie) 的大部分静态 HTML,这可能非常有用。
    【解决方案3】:

    那不是 Perl。我猜这是一个正则表达式?而且我猜您正在尝试匹配不包含“http”的字符?如果是这样,你想要

    (?:(?!http).)*
    

    (?:(?!STRING).)(?:STRING) 就像 [^CHAR]CHAR

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 2011-05-29
      • 2015-04-16
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      • 2020-07-09
      相关资源
      最近更新 更多