0

私のスクリプトには、HTML の文字列を取り込んで同じ文字列を返す関数がありますが、すべての要素が 2 レベル高いものに変更されているという例外があります (つまり、h1->h3、h2-> h4など)。これは大文字と小文字を区別せずに機能する必要があり、属性を削除してはなりませんが、非常に単純なタスクであるため、完全な html パーサーを使用するつもりはありません。これを正規表現で。問題は (私は vbscript とすべてにかなり慣れていないため)、目的の効果を達成する方法がわからないことです。

私が現在持っているのはこれです:

Function fiksoverskrifter(html)
   Dim regex, matches, match
   Set regex = New RegExp
   regex.Pattern = "<(/?)h([0-9])(.*?)>"
   regex.IgnoreCase = True
   regex.Multiline = False

   fiksoverskrifter = html

   Set matches = regex.Execute(html)
   For Each match in matches

   Next

   Set regex = Nothing
   Set matches = Nothing
   Set match = Nothing
End Function

-loop内で必要なのFor Eachは単純に数値を交換することですが、その方法がわかりません ( match-object が公開するプロパティがわからず、オンラインで見つけることができませんでした)。 .

この機能を完了するにはどうすればよいですか?

4

2 に答える 2

2

正規表現でこれを実行しようとすると苦痛を求めています(置換ではなく、単一の正規表現パターンでの増分であるという事実)。ヘッダーを置換する場合のみの場合は、replace()を使用します。

For i = 4 To 1 Step -1
    strHtml = replace(strHtml, "<h" & cstr(i), "<h" & cstr(i + 2), 1, -1, vbTextCompare)
    strHtml = replace(strHtml , "</h" & cstr(i), "</h" & cstr(i + 2), 1, -1, vbTextCompare)
Next

(HTML仕様は---無視するかどうかわからない場合にのみ有効H1です&)H6H5H6

正規表現オプションを使い続けたい場合は、regex.replace()

JavaScriptでは、一致したパターンを関数に渡して、その関数を置換として使用できることを知っています。これは、ここで必要なものですが、VBSCRIPTでこれが行われるのを見たことがありません。例: RegExpを使用して、括弧で囲まれた数値を一致させてからインクリメントします。それ

編集1:

一致コレクションと一致オブジェクトへの参照が見つかりました:

http://msdn.microsoft.com/en-us/library/ms974570.aspx#scripting05_topic3

したがって、match.valueプロパティから一致を読み取ることはできますが、それでも2番目の置換に頼る必要があると思います

于 2012-06-12T09:50:35.267 に答える
0

VBScript ではなく Perl にあるため、おそらくトピックから外れている、より一般的な解決策を次に示します。正規表現が持つ傾向がある書き込み専用効果に対抗するために、これを文書化したことに注意してください。

C:\TEMP :: more /t4 hdradj.pl
use strict;
use warnings;

# Make a subroutine that will adjust HTML headers
# (like h1, H2) by doing string replacement.
# Will only work properly for the range from 1 to 9.
sub mk_header_adjuster {
    my( $adjustment, $lower, $upper ) = @_;
# Compile substitution expression to adjust headers like h1, H2.
# Left-hand side matches headers from the range specified.
# Uses word boundaries (\b) and a character range (square brackets).
# Captures matches for "h|H" in $1 and for the level in $2.
# Right-hand side uses an eval (e-switch) to compute substitution.
# Case is ignored (i-switch), replacement is global (g-switch).
# Wraps expression in subroutine to modify first argument.
    my $str = <<"EOSUB";
sub {
    \$_[0] =~ s/\\b(h)([$lower-$upper])\\b/\$1 . (\$2 + $adjustment)/ige
}
EOSUB
#   print $str, "\n"; # debug output
    my $sub = eval $str; # compile expression
    die $@ if $@; # abort in case of errors in eval compilation
    return $sub;
}

# ==== main ====
# Test the above subroutine is working properly.
my $test_input = <<'EOS';
<h1>eins</h1>
<p>...
<h2 bla="blub">eins blub</h2>
< H2 >zwei </ H2>
<h3 >drei </h3>
<h4>vier </h4>
<h5>fünf </h5>
EOS

# Compile a header adjuster moving headers 2 to 4 by 2 levels down.
my $adjuster = mk_header_adjuster 2, 2, 4;
my $number_of_replacements = $adjuster->( $test_input );
printf STDERR
"Replaced %u header tags in supplied input.\n", $number_of_replacements;
print $test_input;
于 2012-06-12T10:34:26.380 に答える