• ベストアンサー

正規表現を使って?

置換の正規表現を使ってこのURLを (例) <A href="http://123.com/456/789/"><IMG src="http://123/456/789.jpg" border="0"></A> <A href="http://123.com/456/789/">リンク先</A> このようにしたいです。 <A href="http://tesuto=http%3A%2F%2F123.com%2F456%2F789%2F"><IMG src="http://123/456/789.jpg" border="0"></A> <A href="http://tesuto=http%3A%2F%2F123.com%2F456%2F789%2F">リンク先</A> :は%3aに /は%2fに 最後にリンク先のURLにhttp://tesuto=を追加したいです。 (<IMG src="からのURLはそのままにしたいです。) ちなみにhtml内には様々なタグが入っていてリンク先も様々なURLが書かれているとします。 (http://123.com/456/789/http://123.com/456/789/abc/dehg/など) 正規表現についてはまったく分からず悩んでいます。 どなたかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • qtea
  • ベストアンサー率77% (38/49)
回答No.5

なんか変な具合なので、再度アップ。 httpのところは、半角のhttpに直してください。 --- BeginUpdate MoveFileStart Replace("href=""http://","href=""http%3a%2f%2f","0","0","0","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)""","href=""\1%2f\2""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5%2f\6""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5%2f\6%2f\7""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5%2f\6%2f\7%2f\8""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5%2f\6%2f\7%2f\8%2f\9""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5%2f\6%2f\7%2f\8%2f\9%2f\10""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5%2f\6%2f\7%2f\8%2f\9%2f\10%2f\11""","1","0","1","0","4","0","1","0") Replace("href=""","href=""http://tesuto=","0","0","0","0","4","0","1","0") EndUpdate

siraku
質問者

お礼

ご回答ありがとうございます。 完璧でした。とても感謝しています。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • qtea
  • ベストアンサー率77% (38/49)
回答No.4

No3だとダメですね(汗) >置換1. href="http: => href="http%3a >置換2. href="http:// => href="http:%2f%2f これは、一回で、 href="http:// => href="http%3a%2f%2f です。 >href="(.*?)/(.*?)" => href="\1%2f\2" (.*?)は([^"]*?)に置き換えてください。 ついでに、URL内の/の数が10個以内に対応させたマクロを書いてみました。 BeginUpdate MoveFileStart Replace("href=""http://","href=""http%3a%2f%2f","0","0","0","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)""","href=""\1%2f\2""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5%2f\6""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5%2f\6%2f\7""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5%2f\6%2f\7%2f\8""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5%2f\6%2f\7%2f\8%2f\9""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5%2f\6%2f\7%2f\8%2f\9%2f\10""","1","0","1","0","4","0","1","0") Replace("href=""([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)/([^""]*?)""","href=""\1%2f\2%2f\3%2f\4%2f\5%2f\6%2f\7%2f\8%2f\9%2f\10%2f\11""","1","0","1","0","4","0","1","0") Replace("href=""","href=""http://tesuto=","0","0","0","0","4","0","1","0") EndUpdate

すると、全ての回答が全文表示されます。
  • qtea
  • ベストアンサー率77% (38/49)
回答No.3

エディターの置換機能だけで実現させるなら… (検索後 => 置換する後) 置換1. href="http: => href="http%3a 置換2. href="http:// => href="http:%2f%2f ここまでは、簡単なのですが…次からは、ちょっと、面倒。 <a>のURLの/の数の種類分、置換してあげる。 例えば、1個(123.com/ or 123.com/456),2個(123.com/456/ or 123.com/456/789),3個(123.com/456/789/ or 123.com/456/789/abc)の三種類のパターンしかないのであれば… 置換3.123.com/ or 123.com/456の場合 href="(.*?)/(.*?)" => href="\1%2f\2" 置換4.123.com/456/ or 123.com/456/789の場合 href="(.*?)/(.*?)/(.*?)" => href="\1%2f\2%2f\3" 置換5.123.com/456/789/ or 123.com/456/789/abcの場合 href="(.*?)/(.*?)/(.*?)/(.*?)" => href="\1%2f\2%2f\3%2f\4" のような感じ。 で、最後に、 置換6.href=" => href="http://tesuto= と置換すれば…いけそうではあります。 かなり、無理やりですが。

すると、全ての回答が全文表示されます。
回答No.2

ご回答します。 最初にご希望の結果というのは 1)<A>~</A>タグ中の<IMG>タグを固定文字列"リンク先"に変更する。   (<IMG>タグを持たない<A>~</A>タグはどうするか      ⇒"リンク先"を挿入しないと解釈しました。) 2)<A>タグのhrefパラメータ("~"の中)において「:→%3a」「/→%2f」の変換をする。 3)2)で変換されたhrefパラメータの値の先頭に固定文字列"http://tesuto="を    挿入する。 ということでよろしいですか? 以上だとすると、少なくともエディタのレベルでは、一回で変換するのは難しいです。 何回かに手順を分けて、それを順番にやっていくしかありません。 しかも、置換のための正規表現が思いつかないものがあります。 エディタでやるなら、都合四段階の手順を踏む必要があります。 (正規表現についてはPerl5.8に準拠しました。) <第一段階> ○<IMG>タグを消してリンク先を挿入 置換前文字列指定:(<A ..*>)<IMG ..*>(<\/A>) 置換後文字列指定:$1リンク先$2 <第ニ段階、第三段階> ○<A>タグのhrefの"~"中のみにおいて「:→%3a」「/→%2f」の変換をする。 ※ エディタの正規表現置換では記述できない。 <第四段階> ○<A>タグのhrefに対して「"」と既存のURL文字列の間に"http://tesuto="を挿入する。 置換前文字列指定:(<A href=")(..*<\/A>) 置換後文字列指定:$1http://tesuto=$2 以上のように手間がかかる事から、sed/awk/perl等のスクリプトで処理してしまった方 が、一回で済みます。 試みにawkで書いたものが以下です。 ---REawk.awk--- /<A..*\/A>/{ #1)   buffer = gensub(/(<A ..*>)<IMG ..*>(<\/A>)/,"\\1リンク先\\2","g"); #2)   href = gensub(/..*(href=\"[^\"][^\"]*\")..*/,"\\1","g",buffer); #3)   gsub(/:/,"%3a",href); #4)   gsub(/\//,"%2f",href); #5)   gsub(/(href=")/,"&http://tesuto=",href); #6)   print gensub(/(..*)(href=\"[^\"][^\"]*\")(..*)/,"\\1" href "\\3","g",buffer);   #7) } gawk -f REawk.awk 対象ファイル名 > 出力ファイル名 1)<A~/A>までを正規表現で表し、この正規表現にマッチする行のみを対象とする。 2)<A>タグと</A>をグループ化し、変換後の文字列に継承する(\\1、\\2がそれを指す。)  \\1と\\2の間に"リンク先"という文字列を挿入する事で結果として<IMG>タグを消す。  その結果を変数bufferに保存する。 3)<A>タグ中のhrefパラメータ全体(href="~~~")をグループ化する事で取り出し、変数  hrefに保存する。 4)変数href上で「:→%3a」を実施(変数hrefが書き換わる)。 5)変数href上で「/→%2f」を実施(変数hrefが書き換わる)。 6)変数href上(href="~~~")で最初のダブルクォートまでをグループ化し、それ(&がグ  ループ化したものを指す)に固定文字列"http://tesuto="を接続する事で挿入する(変数  hrefがが書き換わる。この段階で変数hrefは、  「href="http://tesuto=http%3a%2f%2f123.com%2f456%2f789%2f"」  の形式になっている。) 7)1)で保存した変数buffer中のhrefパラメータ、その他の部分をそれぞれグループ化し、  hrefパラメータ部分を変数hrefで書き換える。そしてそれを出力する。 【注意】 *1  <A>~</A>は、必ず一行を構成している事。  <A href="http://abc.def.ghi.com">  </A>  はダメ。 *2  awk(gawk)のバージョンは3.1.5である事。 それと正規表現=文字置換ではありません。 正規表現はパターンマッチングのための記法ですのでその点誤解の無い様にしてください。

siraku
質問者

お礼

ご回答ありがとうぞざいます。参考にさせて頂きます。

すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

言語は何でしょうか?(私が回答できる訳ではありませんが、言語が判るともっと良い回答が得られるかと思います)

siraku
質問者

補足

お返事ありがとうございます。 HTMLの1つのファイルでの話です。 エディターを使って置換したいと思っています。 今使っているのはK2Editorです。 これって素人では難しい事なのでしょうか?

すると、全ての回答が全文表示されます。

専門家に質問してみよう