私はPerlが初めてで、正規表現に関する質問がいくつかあります
-
05-07-2019 - |
質問
私は自分でPerlを教えていますが、例によって最もよく学びます。そのため、特定のブログをスクレイピングする単純なPerlスクリプトを勉強していますが、いくつかの正規表現ステートメントについて混乱しています。スクリプトは、次のHTMLチャンクを探します。
<dt><a name="2004-10-25"><strong>October 25th</strong></a></dt>
<dd>
<p>
[Content]
</p>
</dd>
... and so on.
そしてこれが私が勉強しているスクリプトの例です:
#!/usr/bin/perl -w
use strict;
use XML::RSS;
use LWP::Simple;
use HTML::Entities;
my $rss = new XML::RSS (version => '1.0');
my $url = "http://www.linux.org.uk/~telsa/Diary/diary.html";
my $page = get($url);
$rss->channel(title => "The more accurate diary. Really.",
link => $url,
description => "Telsa's diary of life with a hacker:"
. " the current ramblings");
foreach (split ('<dt>', $page))
{
if (/<a\sname="
([^"]*) # Anchor name
">
<strong>
([^>]*) # Post title
<\/strong><\/a><\/dt>\s*<dd>
(.*) # Body of post
<\/dd>/six)
{
$rss->add_item(title => $2,
link => "$url#$1",
description => encode_entities($3));
}
}
あなたが私をよりよく理解するのを助ける時間があれば、私の質問は次のとおりです:
-
次の行の仕組み:
([^ <!> quot;] *)#アンカー名
-
次の行の仕組み:
([^ <!> gt;] *)#投稿タイトル
-
<!> quot; six <!> quot;の機能次の行の意味:
<!> lt; / dd <!> gt; / six)
ご協力いただきありがとうございます。私は現在、自分の質問に対する答えも調査していますが、誰かが私を後押ししてくれることを望んでいました!
解決
次の行の仕組み...
([^ <!> quot;] *)#アンカー名
<!> quotではない0個以上のもの。ブラケットの数に応じて、$ 1、$ 2、または何でもキャプチャされます(私たちはそうです。
次の行の仕組み...
([^ <!> gt;] *)#投稿タイトル
0個以上の<!> gt;ではないもの、$ 1、$ 2、またはその他のものとしてキャプチャされます。
<!> quot; six <!> quot;の機能で意味する 次の行...
<!> lt; / dd <!> gt; / six)
- s =単一行として一致します(これは、<!> quot;。<!> quot;は、\ nを含むすべてに一致することを意味します。
- i =大文字と小文字を区別しないで一致する
- x =正規表現の空白を無視します。
x
を使用すると、正規表現自体にコメントを挿入することもできるため、# Post title
のようなものはコメントだけです。
詳細/より良い情報については、 perldoc perlre をご覧ください。リンクはPerl 5.10用です。 Perl 5.10をお持ちでない場合は、代わりにご使用のバージョンのPerlのperlreドキュメントをご覧ください。
他のヒント
-
[^"]*
は、<!> quot;引用符を含まないゼロ個以上の文字列<!> quot;を意味します。これは、引用符で囲まれ、<a name=
に続く種類の引用文字列を形成します
-
[^>]*
は上記と似ていますが、>
を含まない文字列を意味します。おそらく[^<]
を意味し、次のタグの開始<
まで一致することに注意してください。実際の開始は含まれません。 - これは、PHP固有の正規表現フラグのコレクションです。
i
は大文字と小文字を区別しないことを意味し、残りについてはわかりません。