- ベストアンサー
正規表現で詰まっています。
こんにちは。 今、正規表現で困っています。 ファイルの中身 <meta name="description" content=""> <title> B'zのサイトへようこそ </title> 上記のようなhtmlのソースなのですが、以下のように変換できるように正規表現を考えましたが、できませんでした。 変換したい表現 <meta name="description" content="B'zのサイトへようこそ"> <title> B'zのサイトへようこそ </title> titleタグで囲まれた文字を、metaタグのcontentの中に入れたいのです。 とても困っています。どなたかご教授下さい。よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>もし複数ファイルを一括で変換できるフリーウェアがありましたら、それとともに教えていただきたいのですが。 ActivePerlをインストールして簡単な置換スクリプトを作ってみては? #ActivePerlの参考url http://pocketstudio.jp/win/activeperl/ とりあえず簡単な置換スクリプトを作ってみました コピペでファイルを作って実行(マイコンピューターからフォルダを開いてクリック)すると置換出来ます ###okikae.plの内容### #置き換え定義ファイルの読み込み open(IN,"okikae.txt"); while(<IN>){ next if(/^[#\n]/); if(/^indir/){(undef,$indir)=split(/[=\n]/);next;} if(/^outdir/){(undef,$outdir)=split(/[=\n]/);next;} if(/^ext/){(undef,$exts)=split(/[=\n]/);next;} push(@patterns,$_); } close(IN); #置き換え処理 foreach $ext (split(/;/,$exts)){ foreach $file (glob("$indir/$ext")) { open(IN,$file);@data=<IN>;close(IN);$buf=join("",@data); foreach $eval (@patterns){eval("\$buf=~$eval");} $outfile="/$file";$outfile=~s|^.+/||; open(OUT,">$outdir/$outfile");print OUT $buf;close(OUT); } } ###okikae.txtの内容(okikae.plと同じ所に置く)### #フォルダ設定(最後に"/"は付けない) indir=/work/in outdir=/work/out #ターゲットファイルの拡張子指定(;で区切って複数指定可) ext=*.html;*.htm #置き換えパターン(evalで順番に実行する) s/(<meta name="description" content=")[^<]*(<title>\n?([^\n]*)\n?<\/title>)/$1$3">\n$2/i
その他の回答 (3)
- sakusaker7
- ベストアンサー率62% (800/1280)
pipipi523 さんの回答がついて気がついたのですが、5/2に補足をいただいた後 その返事を投稿したはずなのですがありません。 はて? それはともかく経過を申し上げると、いろいろやってみたのですが残念ながら TextSSを使ってはできませんでした。 もうちょっとがんばってはみますけど、このツールの制限なのかバグなのかちょっと判断できないところがあります。 > s/(<meta name="description" content=")[^<]*(<title>\n?([^\n]*)\n<\/title>)/$1$3">\n$2/mk この正規表現を s/(<meta name="description" content=")[^<]*(<title>([^<]*)<)/$1$3">$2/mk のようにすると、 <meta name="description" content="B'zのサイトへようこそ"> <title> B'zのサイトへようこそ </title> ではなく <meta name="description" content=" B'zのサイトへようこそ "> <title> B'zのサイトへようこそ </title> というところまではこぎつけました。 自分はこの手の変換は pipipi523 さんの挙げたPerlだとか、sed, awkの ようなもののスクリプト(プログラム)を 書いて済ませますので、ほかのツール、といわれてもよくわかりません。 ただ、Vectorをみるといくつかはあるようですね。 Download: Windows > ユーティリティ > テキストファイル用 > テキスト変換 http://www.vector.co.jp/vpack/filearea/win/util/text/conv/ 2ちゃんねるにもこの手のツールを扱うスレッドがありました。 【Grep】複数ファイル文字列検索ソフト【置換】 http://pc11.2ch.net/test/read.cgi/software/1087433838/ ●置換機能あり Speeeeed http://akky.cjb.net/download/speeeeed.html YokkaGrep http://www.yokka.com/yokkasoft/ Devas http://village.infoweb.ne.jp/~fwhk9290/gimite/ Repl-Ace http://www.sirmiles.com/software/repl_ace.htm FileGrep http://www3.plala.or.jp/kazuasa/filegrep.html PsBR http://www.pst.co.jp/Powersoft/DownLoad/PsBR.htm といったものが挙げられれています。
お礼
sakusaker7さん、 ありがとうございます。回答を付けられたのですか…すみません、見えません。おしえてgooがちょっとおかしかったのでしょうか…。 教えていただいたサイトに行ってみました。本当にありがとうございます。 なんとかやりとげました。ありがとうございました。
- sakusaker7
- ベストアンサー率62% (800/1280)
気を悪くなどしていませんのでその辺はお気使いなく。 こういう言い回しを気にする性質ですので、その辺了解いただけると幸いです。 #人様に「教授」できるほど自分は大層なものじゃないので。はい。 TextSSなるものを知らなかったのでちょっと調べてみました。 申し訳ないのですが、VBランタイムを要求する、setup.exeを使用した ものなので自分の環境にインストールして 試してはいません。 正規表現による置換の指定で s/(<meta name="description" content=")[^<]*(<title>\n?([^\n]*)\n<\/title>)/$1$3">\n$2/mk としてみてください。 titleが複数出現するとは思えないのでgオプションはつけていません。 改行の扱いが微妙なのでこれでうまく行くかは ちょっと自信がありませんが。 試してみてうまくいかなかったら補足してください。 その際にはどのように置換されたのかを書いていただけると助かります。
補足
sakusaker7さん、 素早いご回答、ありがとうございます。とても嬉しいです。 ご回答の s/(<meta name="description" content=")[^<]*(<title>\n?([^\n]*)\n<\/title>)/$1$3">\n$2/mk を試してみたのですが、うまくいきませんでした。以下の4つの例に絞ってやってみたのですが、変換されませんでした。 1つ目 <title> 文字列 </title> 2つ目 <title>文字列</title> 3つ目 <title>文字列 </title> 4つ目 <title> 文字列</title> tr/[0-9]/[0-9]/gk というのは変換されたので、もしかしたら何かが違うのかも知れません。すみません、説明が下手です。 もし複数ファイルを一括で変換できるフリーウェアがありましたら、それとともに教えていただきたいのですが。 泣き言ばかりですみません。よろしくお願いいたします。
- sakusaker7
- ベストアンサー率62% (800/1280)
言語が指定されていないのですが、なにでしょうか? カテゴリがPerlでもPHPでもないので判断に苦しみますが、 Perlで書いてみました。 use strict; use warnings; my $str = <<EOS; <meta name="description" content=""> <title> B'zのサイトへようこそ </title> EOS my $pat = qr{(<meta name="description" content=")[^<]*(<title>\n?([^\n]*)\n</title>)}ms; my $newstr; ($newstr = $str) =~s{$pat}{$1$3">\n$2}; print $newstr; 実行結果: <meta name="description" content="B'zのサイトへようこそ"> <title> B'zのサイトへようこそ </title> それからこういう場合は「教授」でなく「教示」を 使います。 前回噛付かれたので詳しく書きますけど、 「教授する」というのは書道の教室だとか 学校の勉強のように 専門的な技であるとか知識を系統立てて教えこむことで、 一回こっきりの「教えること」には使いません。 大辞林という辞書にはその辺書いてないらしいですが。
お礼
sakusaker7さん、 大変ご親切にありがとうございます。説明が不足しておりました。 フリーフェアで、正規表現を使って、htmlファイルのtitleタグの中にある文字を、metaタグのcontent内に入れたいです。 htmlファイルは膨大な数があります。そのため、手入力が難しいので、フリーウェアの正規表現による置換機能を使って、以下のようにしたいです。 htmlファイルの下のようなtitleタグにある表現をmetaタグのcontent内に入れる。 <meta name="description" content=""> <title> B'zのサイトへようこそ </title> 変換したい表現 <meta name="description" content="B'zのサイトへようこそ"> <title> B'zのサイトへようこそ </title> perlでもPHPでもなく、ただのhtmlファイルの変換です。 使用しているフリーウェアは http://www.vector.co.jp/soft/win95/util/se072729.html です。 それから「教示」のこと、ご指摘ありがとうございます。普段は気をつけてそうしているのですが、今回ばかりは使ってしまいました。不愉快なお気持ちにさせてしまいましたら、申し訳ございません。 以上ですが、なんとかよろしくお願いいたします。失礼いたします。
お礼
pipipi523さん、 ありがとうございます。なんとかできました!とても嬉しいです☆ こんなにご親切に、どうもありがとうございました。