2

プレーンテキスト入力を解析し、すべてのリンクを有効なHTML HREFリンクに変換するには、Perl正規表現が必要です。Webで見つけた10の異なるバージョンを試しましたが、どれも正しく機能していないようです。StackOverflowに投稿された他のソリューションもテストしましたが、どれも機能していないようです。正しい解決策は、プレーンテキスト入力で任意のURLを見つけて、次のように変換できるはずです。

<a href="$1">$1</a>

私が試した他の正規表現が正しく処理されなかった場合があります。

  1. 行末のURLの後にリターンが続く
  2. 疑問符を含むURL
  3. 'https'で始まるURL

私は、そこにいる別のPerlの人が、共有できるこのために使用している正規表現をすでに持っていることを望んでいます。よろしくお願いします!

4

4 に答える 4

10

URI::Findが必要です。リンクを抽出すると、残りの問題を問題なく処理できるようになります。

これは、「URLを抽出するにはどうすればよいですか?」に対するperlfaq9の回答で回答されています。、 ところで。それらのperlfaqにはたくさんの良いものがあります。:)

于 2010-04-02T01:56:48.000 に答える
4

さらにURI::Find、大きな正規表現データベースをチェックアウトします。Regexp::Common、次のような簡単なものを提供するRegexp :: Common::URIモジュールがあります。

my ($uri) = $str =~ /$RE{URI}{-keep}/;

そのURIに異なる部分(ホスト名、クエリパラメータなど)が必要な場合は、正規表現でキャプチャされるものについて、 Regexp :: Common :: URI::httpのドキュメントを参照してください。$RE{URI}

于 2010-04-02T04:06:40.533 に答える
2

URI :: Find ::Schemelessを次のテキストで試したとき:

これがURLと1つの裸のURLです
https:https://www.example.comとクエリを使用した別の
http://example.org/?test=one&another=2および括弧付きの別の
http://example.org/(9.3)

引用符で囲まれたもう1つの「http://www.example.net/s=1;q=5」
など。ftpサイトへのリンク:ftp://user@example.org/test/me
プロトコルwww.example.comのないものはどうですか?

それはめちゃくちゃhttp://example.org/(9.3)だから、私はRegexp :: Commonの助けを借りて次のことを思いついた:

#!/usr/bin/perl

use strict; use warnings;
use CGI 'escapeHTML';
use Regexp::Common qw/URI/;
use URI::Find::Schemeless;

my $heuristic = URI::Find::Schemeless->schemeless_uri_re;

my $pattern = qr{
    $RE{URI}{HTTP}{-scheme=>'https?'} |
    $RE{URI}{FTP} |
    $heuristic
}x;

local $/ = '';

while ( my $par = <DATA> ) {
    chomp $par;
    $par =~ s/</&lt;/g;
    $par =~ s/( $pattern ) / linkify($1) /gex;
    print "<p>$par</p>\n";
}

sub linkify {
    my ($str) = @_;
    $str = "http://$str" unless $str =~ /^[fh]t(?:p|tp)/;
    $str = escapeHTML($str);
    sprintf q|<a href="%s">%s</a>|, ($str) x 2;
}

これは、示されている入力に対して機能しました。もちろん、試してみるとわかるほど簡単な生活はありません(http://example.org/(9.3))

于 2010-04-02T06:10:04.927 に答える
1

ここでは、URLを抽出する方法を使用してサンプルコードを投稿しました。ここでは、stdinからの行を取得します。また、入力行に有効なURL形式が含まれているかどうかを確認します。そしてそれはあなたにURLを与えるでしょう

use strict;
use warnings;

use Regexp::Common qw /URI/;

while (1)
{
        #getting the input from stdin.
        print "Enter the line: \n";
        my $line = <>;
        chomp ($line); #removing the unwanted new line character
        my ($uri)= $line =~ /$RE{URI}{HTTP}{-keep}/       and  print "Contains an HTTP URI.\n";
        print "URL : $uri\n" if ($uri);
}

私が得ているサンプル出力は次のとおりです

Enter the line:
http://stackoverflow.com/posts/2565350/
Contains an HTTP URI.
URL : http://stackoverflow.com/posts/2565350/
Enter the line:
this is not valid url line
Enter the line:
www.google.com
Enter the line:
http://
Enter the line:
http://www.google.com
Contains an HTTP URI.
URL : http://www.google.com
于 2010-04-02T06:36:12.533 に答える