1

次のようなユーザー入力に取り組んでいます

  • foo
  • wikt:foo
  • Bar#hiそこに

次のような入力のhttpsリンクを取得するには

私はこれを最小限の手動で、可能な限りクリーンな方法で実行しようとしているので、スクリプトをどこかにアップロードして、品質の低さを恥じることなく人々に見せることができます。これの意味は:

  • httpsではなくhttpリンクを取得した場合、s/^http/^https/置換をハードコーディングしたくありません。
  • 不完全なリンクを取得した場合、不足しているものを追加するために正規表現を使用したくありません。

これまでに2つの解決策を見つけましたが、それぞれに欠陥があります。

解析クエリ

canonicalurlマジックワードを使用して、{{canonicalurl:user_input_here}}で解析クエリを実行します。ただし、httpsリンクではなくhttpのみを提供します。

#!/usr/bin/perl
use strict;
use warnings;
use MediaWiki::API;
use Data::Dumper;

my $mw = MediaWiki::API->new();
$mw->{config}->{api_url} = 'https://en.wikipedia.org/w/api.php';

my $info_ref = $mw->api ( {
    action      => 'parse',
    prop        => 'text',
    text        => '{{canonicalurl:Hello}}',
} ) or die $mw->{error}->{code} . ': ' . $mw->{error}->{details};
my $html = $info_ref->{parse}{text}{'*'};
print Dumper $html;

情報クエリ

情報クエリを使用します。ただし、セクションでは機能しません。つまり、「Foo#bar」入力は「Foo」にリンクする出力を取得します。

#!/usr/bin/perl
use strict;
use warnings;
use MediaWiki::API;

my $mw = MediaWiki::API->new();
$mw->{config}->{api_url} = 'https://en.wikipedia.org/w/api.php';

sub get_url_by_title(){
  my $title = shift;

  my $info_ref = $mw->api ( {
    action      => 'query',
    prop        => 'info',
    inprop      => 'url',
    iwurl       => 1,
    titles     => $title,
  } ) or die $mw->{error}->{code} . ': ' . $mw->{error}->{details};

    if (exists $info_ref->{query}{pages}){
      return (values $info_ref->{query}{pages})[0]{'fullurl'};
    }
    elsif (exists $info_ref->{query}{interwiki}){
      return (values  $info_ref->{query}{interwiki})[0]{'url'};
    }
}
4

1 に答える 1

2

正規URLとは、Wikiの正規URLのタイプを指します。ウィキメディアの現在の構成では、これはhttpです。(それがいつか変わっても驚かないでしょう)。見ることができるのは{{fullurl:Pagename}}です。httpとhttpsの両方が有効な場合は、「//」で始まるURLで応答します。それ以外の場合は、通常のURLで応答します。

情報クエリ(2番目の方法)は、パーサーを呼び出さないため、より適切な場合があります(これは、サーバーの作業が少し少なくなりますが、実際には問題ではありません)。その後、ターゲット(または#記号の後の部分は何日も呼ばれません)をURLの最後に配置することは常に可能です。

于 2012-12-10T23:22:39.947 に答える