@ララ尋ねられた正規表現置換 <*> はどのように使用できますか?掴むことについてURLからHTML 。 ここでは、提案された 3 つの回答についてもう少し詳しく説明します。 まず、免責事項: これらの例はいずれも HTML を適切に解析していないため、実際には存在しない URL を見つけたり、実際には存在する他の URL を見逃したりする可能性があります。
/*
THIS IS NOT AN HTML PARSER
HTML parsers are hard to write. There are better ways.
Neither of these JSL ideas can properly skip comments or
many other HTML tags that should be skipped. They will
find things they shouldn't and miss other things they
should find. They've only been minimally tested on one site.
This code is presented as "how can I use contains() vs patmatch()
to efficiently work through a large string looking for something?"
The second example is FIVE TIMES FASTER and a LITTLE MORE ACCURATE.
The third example uses text explorer to grab links. I don't think
there is a pre-existing regex for the link text descriptions. It works
very similar to this code; it is NOT an HTML parser either.
If you can use python, you might want to investigate "beautiful soup".
I've not used it, but believe it addresses the "hard to write" issue.
*/
HTML の解析における問題のほとんどは、一致する開始タグと終了タグを見つけて、その間のデータを調べることです。 ここで紹介する JSL はすべて、HTML 機能によってつまずく可能性があります。 しかし、それで十分かもしれません。独自のテストを行ってください。 こちらもご覧ください美しいスープそれはより良い答えかもしれません。
以下は、ページ上に表示される URL (href= 部分) と少しのテキスト (Discussions 部分) を含むリンク ( タグ) を示す HTML Web ページの一部です。
< a > tag with URL and Text< a > tag with URL and Text< a > tag with URL and Text< a > tag with URL and Text< a > tag with URL and TextURL とテキストを含む < a > タグ
目標は、URL とリンク テキストを 1 行に 1 つずつ含むデータ テーブルを作成することです。 一般的な Web ページには 100 個程度のリンクがあり、テキストの量は 0.5 メガバイトになります。 一遅いこの問題に対処する方法 (図示されていません) は、一度に 1 つのリンクを検索する単純な正規表現を作成し、テキストからリンクを削除し、見つからなくなるまでこれを繰り返すことです。 1 つか 2 つだけあれば、素晴らしいです。 しかし、100 個のデータが存在する可能性がある場合、数百メガバイトのデータが操作および検索されることになります。
より高速な方法は、データを検索し、常に前に進み、リンクが見つかるとデータ テーブルを構築することです。 最初の例では、開始位置を指定する 3 番目の引数を持つ contains() 関数を使用します。 Contains() は、見つかった位置も返します。 開始位置を見つかった位置の直後に更新することで、contains() はテキストをバックアップしたり変更したりすることなく、テキストを効率的に調べることができます。
u = "https://community.jmp.com/t5/Discussions/bd-p/discussions";
txt = Load Text File( u );
// a link on a page has at least two parts:
// the URL and some descriptive text.
// <A ...="" href="https://community.jmp.com/url" ...="" target="_blank"> descripton </A>
// p1 p4 p5
// using contains and regex. "<A>", p1 + 3 ); // find the end of the opening tag
p5 = Contains( txt, "</A>", p4 + 1 ); // find the ending tag
if( p5 > p4, // as long as the end is not zero, we found one, see break() below
desc = Substr( txt, p4 + 1, p5 - p4 - 1 ); // the visible link description. Images can be here too.
desc = Regex( desc, "<[^>]*>", "", globalreplace ); // remove span, image, etc tags
linktext = Substr( txt, p1, p4 - p1 + 1 ); // <A href="https://community.jmp.com/" target="_blank">
hreftext = Regex( linktext, "href\s*=\s*(\!"|')(.*?)(\1)", "\2" );// use regex to get the href value
if( !Is Missing( hreftext ), // sometimes there isn't one
dt << addrows( 1 );
irow = N Rows( dt );
dt:link[irow] = hreftext;
dt:description[irow] = desc;
);
, // else
Break() // no more end tags. there is maybe a mess of javascript.
);
pos = Max( pos, p5 + 3 ); // advance past the one just found
);
stoptime = Tick Seconds();
dt << endDataUpdate;
Show( stoptime - starttime ); </A>
そのコードの中心となるのは次の行です
while( (p1 = Contains( txt, "<A></A>
これは一連のジョブを実行しています。3 番目の引数で pos を使用して前の作業をスキップし、リンク タグを開始する次の 何も見つかりませんとなり、ループが停止します。 次の行
p4 = Contains( txt, ">", p1 + 3 );
を検索します。 p4 (コメントを参照) がそこを指します。 p1+3 から開始することで、contains() は、以前の出現を再検索するのではなく、p1 の後のものを検索します。 次の行も同様で、p4 の後の終了タグを探しています。
p5 = Contains( txt, "", p4 + 1 );
p5 は、リンク テキストを終了する タグを指します。 すべてではありませんが、多くの HTML タグは、/ のない開始タグとスラッシュの付いた終了タグのように機能します。 を使用して、開始タグと終了タグが同じである場合がありますが、この JSL はその可能性を無視しています。
if ステートメントは、何かが見つかったかどうかを判断し、見つかった場合は次のような説明を取得します。
desc = Substr( txt, p4 + 1, p5 - p4 - 1 );
p4 と p5 は > と < を指しています。したがって、p4+1 は最初の説明文字であり、p5-p4-1 は説明の長さです。 次の行では、埋め込みタグを削除して説明をクリーンアップします。
desc = Regex( desc, "<[^>]*>", "", globalreplace );
GlobalReplace は、正規表現がパターンを見つけて、そのテキストを可能な限り何度も何も置き換えないことを意味します。 パターンは < に一致し、その後に > ではない 0 個以上の文字が続き、その後に 
p1 と p4 (コメントを参照) はリンク タグの位置全体です。 linktext は、多数の不要なビットを含むリンク タグです。 hreftext は regex() を使用して、href 引用符またはアポストロフィの間の URL だけを抽出します。 正規表現パターンは、後方参照 \1 を使用して、末尾のアポストロフィまたは引用符が先頭のアポストロフィまたは引用符と一致することを確認します。 正規表現パターンの最初の開き括弧は、" または ' に一致するキャプチャ グループ (\1 用) を作成します。 2 番目の開き括弧は、一致するキャプチャ グループ (\2) であり、区切り文字間の一致に必要な限り、しぶしぶ前に進みます。 3 番目の開き括弧はキャプチャ グループ 3 です。括弧とグループ化は実際には必要ありません。 結果の \2 は単なる URL です。