' VBSでのhtmlタグ要素名の置換
' htmlファイルのタグ名を小文字に統一するスクリプトを作りたいと思っています。
' で、以下のスクリプトを書きました。(問題は置換処理だけなので要点をシンプルに抜き出しました)
' 要素名をすべて記述するのではなく、「<[A-Z]+」等のように記述してヒットした結果を
' 小文字化するなどして置換をおこないたいと思っています。
' (将来的には属性名も対応したいと思っています)
' ずばりそのものの記述・代替案等を希望しています。
' よろしくお願いします。
' ※可能ならコードonlyで会話しましょう。

Option Explicit

Dim reg
Set reg = New RegExp


Function replace(bodyStr, beforeStr, afterStr)
reg.Pattern = beforeStr
reg.Global = True
replace = reg.Replace(bodyStr, afterStr)
End Function


Dim fileText
fileText = "<HTML>HTML</HTML>"

' 要素名の小文字化
' fileText = replace(fileText, "<HTML+", "<html")
' fileText = replace(fileText, "</HTML", "</html")
fileText = replace(fileText, "<[A-Z]+", LCase(RegExp.$1))


If fileText = "<html>HTML</html>" Then
MsgBox "期待通り!"
Else
MsgBox "これじゃダメだよ…orz:" + fileText
End If

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>問題は置換処理だけなので要点をシンプルに抜き出しました


とのことですが、お示しのコードを実行すると、「RegExp.$1」のところでエラーになってしまって、よく分かりませんので、下記の様になコードを書いて実行してみました。
 ご参考になれば幸いです。

Option Explicit
Dim reg
Set reg = New RegExp
Dim beforeStr
beforeStr = InputBox("HTML タグを入力してください。", "htmlタグ要素名の置換")
With reg
.Pattern = "<[^ >]*"
.Global = True
End With
Dim fileText
Set fileText = reg.Execute(beforeStr)
Dim i, afterStr
afterStr = beforeStr
For i = 0 To fileText.Count - 1
afterStr = replace(afterStr, fileText(i), LCase(fileText(i)))
Next
MsgBox afterStr
    • good
    • 0
この回答へのお礼

>「RegExp.$1」のところでエラーになってしまって、

これはJScriptでの書き方です。
もし両方わかる人だったらすぐに伝わるだろうと思って書きました。
なんとなく意図を伝えようとしているだけでVB系のコードとしては
特に意味はありません。


教えていただいたコードでやりたいことは達成できました。
また、最初に私が考えていた方法では無理そうということもわかりました。

参考になりました。
ありがとうございました。

お礼日時:2009/05/19 15:44

VBSの場合は RegExpのExecuteでMatchesコレクションを取得して処理します



Dim objMatchColl, objMatch
Set objMatchColl = Reg.Execute( fileText )
for each objMatch in objMatchColl
  Reg.Replace(fileText, LCase( objMatch ) )
next
といった具合でしょう

入れ子になったタグを処理したいなら patternを "<([A-Z].*?)>(.*?)<\/\1>"などとして
if objMatchColl.Count > 1 then
' 再帰呼び出しで objMatchColl(1)を処理する
end if
といった処理が必要になってくるでしょう
    • good
    • 0
この回答へのお礼

なるほど。for each のほうがスマートですね。
参考になりました。ありがとうございました。

お礼日時:2009/05/22 01:09

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVLANタグについて

下記場合のときのVLANタグについて教えてください。
シスコのcatalyst3550利用しています。
VLANポート1から入ってきたパケットが、ルーティングされ、VLAN10のポートからパケットが出力されて別スイッチに行くとき、パケットにVLANタグ10は付与されるのでしょうか。それとも、タグは付与されずに送信されるのでしょうか。
なお、VLAN10を割り当てているポートははトランクポートでなく、アクセスポートとなります。

Aベストアンサー

http://xfreak.com/ccna/point/ccna/index.cgi?mode=view&no=58
VLAN tagが付与されずに送信されるのがaccessポート
そもそもaccessポートとtrunkポートの違いを理解してないと思われます

#他のベンダのL2SW/L3SWみたいにtagged/untaggedポートって表現すればわかりやすいのに、Ciscoは.....

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む

QVLANの種類とタグVLANのスッチングハブについて

VLANに関して調べていましたが、いくつかの種類があることがわかりました。私の用途は下宿で各部屋にネットを提供する場合に各部屋のPC間の通信を遮断したいと思っています。

お聞きしたいのは以下の点です。

・このような場合に使えるのは、ポートVLAN、タグvlan、マックアドレスVLANだろうと思われますが、3つのうちどれがよいのでしょうか??

・マックアドレスVLANに関して、MACアドレスでVLANを構成するもののようですが、これの場合、有線でなくても無線でも使えそうな気がしたのですが、間違いですか??? (ひとつのAPではVLANは難しいとの回答がURLの質問でありましたが。)

http://oshiete1.goo.ne.jp/qa5050689.html

・タグVLANの場合、現在のものはほとんど対応しているようですが、正確にはNICもタグVLANに対応しているものが必要らしいですが、これはスイッチングハブにも適用されるのでしょうか? (VLAN対応ルーターを使おうと思っていますが、ポートが足りないとか部屋にSW-HUBをつけたりといった場合に普通に市販されているハブでよいのかどうか。スッチングとダムの違いのように正確には対応してないといけないが、機能としてうたっていなくても、現在の主流製品では大丈夫という場合は、そのように書いてください。) 

大変、注文の多い質問で申し訳ありませんが、よろしくお願いします。 

VLANに関して調べていましたが、いくつかの種類があることがわかりました。私の用途は下宿で各部屋にネットを提供する場合に各部屋のPC間の通信を遮断したいと思っています。

お聞きしたいのは以下の点です。

・このような場合に使えるのは、ポートVLAN、タグvlan、マックアドレスVLANだろうと思われますが、3つのうちどれがよいのでしょうか??

・マックアドレスVLANに関して、MACアドレスでVLANを構成するもののようですが、これの場合、有線でなくても無線でも使えそうな気がしたのですが、間違いで...続きを読む

Aベストアンサー

>・このような場合に使えるのは~
ご相談されているような状況ですと少なくとも各室へ出ているポートはポートVLANにした方が良さそうです(配線や機器の配置によっては併用)。各室までタグを送るメリットもあまりありませんし、専門家以外には運用の敷居がちょっと高いです。

>・マックアドレスVLANに関して~
これはVLANの方式そのものではなく、予めどのポートをどのVLANに繋ぐかを設定しておくのではなく、MACアドレスを利用してどの端末がどのVLANに繋がるかを決めておいて、スイッチのどのポートに繋がっても同じVLANに繋がるようにするという技術です。
ご相談のケースなら1号室の入居者が自分のノートPCを持っていって3号室から繋いでも1号室に割り当てられているVLANに繋がるようになります。これはこれで便利なのですが、管理が面倒ですしご相談のケースには適していません。

>・タグVLANの場合、現在のものはほとんど対応しているようですが、
おっしゃるとおり、各室までをタグVLANにするとNICでも対応が必要ですし、当然正しく設定する必要もあります。
スイッチングハブに関してはイーサネットフレームを終端しませんので
特にタグVLAN対応をうたっていなくても大丈夫です。タグVLANを利用する場合、通常のイーサネットフレームより4Byteフレーム長が長くなるので最大フレーム長が1522Byte以上の物を選んでください。「10年前に発売された物」なんていう骨董品でもない限り問題は無いはずですが。

最後になりますがご質問の内容を拝見する限り、どの道LANの配線工事で専門の業者さんを利用されることになるでしょうから、地場のSIerさんや工事業者さんに、ご相談された方が良いのではないでしょうか?
それこそ商売ですからご希望を詳しく聞き取って最適な物を考えてくれるはずです。
またプロバイダ(eo)との契約はalone0729さんがおこなってLANでネットワークを提供する形態を考えられているようですが、配線だけを予めおこなっておいてプロバイダとの契約は各自行ってもらうという形態であればeoの営業窓口が相談にのってくれるはずです。

>・このような場合に使えるのは~
ご相談されているような状況ですと少なくとも各室へ出ているポートはポートVLANにした方が良さそうです(配線や機器の配置によっては併用)。各室までタグを送るメリットもあまりありませんし、専門家以外には運用の敷居がちょっと高いです。

>・マックアドレスVLANに関して~
これはVLANの方式そのものではなく、予めどのポートをどのVLANに繋ぐかを設定しておくのではなく、MACアドレスを利用してどの端末がどのVLANに繋がるかを決めておいて、スイッチのどのポートに繋が...続きを読む

Qマクロで100マス計算! Dim i,j As Integer For i = 2 ToRang

マクロで100マス計算!

Dim i,j As Integer

For i = 2 ToRange(”A1”).End(xlDown).Row
For j=2 To Range(”B1”).End(xlToRight).Column

Cells(i,j).Value = Cells(i,1).Value * Cells(1,j).Value
Next j
Next i
Endsub

上記のように記述しましたが、
iの最終行が2となってしまっていますがなぜこのコードが間違っているのか分からないです。。どなたか教えていただけたら嬉しいです!

Aベストアンサー

確認してはいませんが…


>改行、スペースは実際にはきちんととっていますので気にしないでください
とのことなので、違っているのかもしれませんが、

>For i = 2 ToRange(”A1”).End(xlDown).Row
         ↓
 For i = 2 To Range(”A1”).End(xlDown).Row
で、うまくいきませんか?
100マス(10×10)と最初から決まっているので、範囲は 2 To 11 でも良いように思いますが…

改行、スペースなどが正しくなっているなら、Range(”A1”).End(xlDown).Rowの値が2以下になっている可能性が考えられます。(ということは、A1が空白セル、または、A3が空白セルなどなど・・)
A1が空白セルの場合は、
 For i = 2 To Range(”A2”).End(xlDown).Row
とするか、
 For i = 2 To 11
などとすることで、動作するのではないかと推測します。

QシスコのVLANタグについて

現在シスコのスイッチとルータを利用しています。
構成は下記で、セグメントXからセグメントYにパケットを送信した場合のVLANタグについて教えてください。

セグメントX-----(A)スイッチ(B)--------(C)ルータ(D)---------セグメントY

スイッチ、ルータには下記設定を実施しています。
(A):アクセスポート(VLAN100)
(B):トランクポート
(C):トランクポート
(D):no switchポート

上記構成の場合、(B)-(C)間ではVLANタグ100がつけられると思いますが、ルータ(D)のインタフェースからパケットが出力されるとき、VLANタグ100はついたままなのでしょうか。それともはずされるのでしょうか。ルータでのVLANタグをはずすタイミングがわからないので、教えていただければ幸いです。

Aベストアンサー

タグがつくのはトランクポートです。
したがって、ルータのインターフェイスDから出て行くときはタグはつきません。
尚、ciscoに限ったことではないと思います。

http://xfreak.com/ccna/point/ccna/index.cgi?mode=view&no=58

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます

QタグVLAN 構築時のハブの種類に関して

VLANを勉強中です。技術的な点でお尋ねします。

デフォルトゲートウェイにVLAN対応のルーターを設置。
1~3階各フロアにタグVLAN対応L2スイッチを設置しているとします。
VIDは三つ作りますが、そのメンバーは階ごとではなく、どの階にも存在するとします。
(VID1、VID2、VID3に属するPCがどの階にも存在する。)



この状況下で、各階の間(1階から2階、2階から3階)の幹線上にVLANに対応しないハブが存在するとします。

この場合、

 ・一つでも存在すると、VLANが機能しない?
 ・問題なくつながる?
 ・条件次第(その条件は?)

どのようになるのでしょうか?

よろしくお願いします。
 

Aベストアンサー

「タグVLAN対応の装置」の間(いわゆるVLANトランク)に「タグVLAN未対応のハブ」を挟むという
解釈で良いでしょうか?

その場合、通常、「タグVLAN未対応のハブ」ではタグVLANのフレームが通過できないため、
通信できなくなります。

もちろん、ポートVLAN(access VLANなど言い方はいくつかある)で接続している部分であれば、
タグVLANフレームが流れる部分ではないため、「タグVLAN未対応のハブ」を挟んでも問題ありません。

QRst.FindFirst "名称コード" & "=" & "'101'"

タイトルのコードでは問題ないのですが、 101 を文字変数にすると「抽出条件でデータ型が一致していません」のエラーになります。この場合シングルクオーテーションはどういう意味なのでしょうか。
どうすれば良いのでしょうか。

dim Vcode as string
Vcode = "101"
Rst.FindFirst "名称コード" & "=" & Vcode

Aベストアンサー

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます。
そこで、

rst.FindFirst "フィールド名 = 'xxx'"

このようにすればOKです。
次のステップとして、xxx の部分を変数を使ってやりたい場合。
単純に変数名に置き換えると、

rst.FindFirst "フィールド名 = '変数名'"

ですが、変数を、"" の中に記述すると、文字列として扱われますので、"" の外に
出してやる必要があります。
その場合、文字列と変数をつなぐためには、& を使います。

rst.FindFirst "フィールド名 = '" & 変数名 & "'"

で、このようになります。

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます...続きを読む

QVLANタグについて

VLANのタグについて教えてください。
下記状況の時、パケットへのVLNAタグがつけられるのか、それともはずされるのか教えてください。
()パケットがスイッチのインタフェース(アクセスインタフェース)に入るとき
(2)パケットがスイッチのインタフェース(アクセスインタフェース)から出るとき
(3)パケットがスイッチのインタフェース(トランク)に入るとき
(4)パケットがスイッチのインタフェース(トランク)から出るとき

初歩的な質問で恐縮ですが、ご教授いただけましたら幸いです。

Aベストアンサー

()パケットがスイッチのインタフェース(アクセスインタフェース)に入るとき
==>タグがついたり、はずされたりはありません。
(2)パケットがスイッチのインタフェース(アクセスインタフェース)から出るとき
==>タグがついたり、はずされたりはありません。
(3)パケットがスイッチのインタフェース(トランク)に入るとき
==>タグがつけられます。
(4)パケットがスイッチのインタフェース(トランク)から出るとき
==>タグはずされます。

http://www5e.biglobe.ne.jp/~aji/30min/sw05.html

QDim x As Integer = 0

いつもお世話になっております。

只今、本に記載してあるソースコードを手入力しています。
標記のように入力したら、『コンパイルエラー 修正候補:ステートメントの最後』というエラーが出ました。

(1)このエラーは無視してもよいのでしょうか?
(2)そもそも、変数の宣言文の後ろに=0をつけている意味がわかりません。当方VB初心者です。

よろしくお願いいたします。

Aベストアンサー

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsugi.ed.jp/vba4graduate/vba_hensuusyokika.htm
ーーー
定数のConstであればこういう書き方はOK
Sub test01()
Const x As Integer = 0
MsgBox x
End Sub
ーーー
VB.NETでは、OK
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim x As Integer = 10
MsgBox(x)
End Sub
ーー
Javaでは可能であるようです
http://msugai.fc2web.com/java/var2.html
ーーーーー
>ろに=0をつけている意味がわかりません
宣言と同時に値を与える=初期化する

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsug...続きを読む


人気Q&Aランキング

おすすめ情報