正規表現での複数箇所の文字列置換について

このQ&Aのポイント
  • 複数箇所の文字列置換についての質問です。特定の文字を検出し、HTMLタグに置換するスクリプトを作成したいです。
  • 文字列中から[id:xxx]を検出して<A>タグに変換し、その後数字部分を抽出してDBからデータを取得したいです。
  • ただ、上記スクリプトでは複数の[id:xxx]があると最初に検出された数字しか取得できません。他に効果的な方法があれば教えてください。
回答を見る
  • ベストアンサー

正規表現での複数箇所の文字列置換について

文字列から特定の文字を検出し、 HTMLタグに置換するスクリプトを作成しようとしています。 例: 元の文字列:xxxxxx[id:1]xxxx[id:2]xxxx  ↓ 置換後の文字列: xxxxxx (<A>タグによるリンク。idが1番のタイトルをDBから参照) xxxx (<A>タグによるリンク。idが2番のタイトルをDBから参照) xxxx 要求している処理順序:  1:文字列中から[id:xxx]を検出して<A>タグに変換  2:id:xxx の xxx部分(数字)を抽出  3:2で得た数字でSQLを実行  4:DBから得た文字列で<A>タグを完成    <A href="test.php?id=(2で得た数字)">(4で得た文字列)</A>  5:以上を[id:xxx]の個数分だけ繰り返し --- スクリプト: // 文字列 $str = "xxxxxx<br>[id:1]<br>xxxx<br>[id:2]<br>xxxx"; // 置換 $result = ereg_replace("\[id:([0-9]+)\]","<a href=\"test.php?id=\\1\">xxx</a>"; ここで、id: の次に続く数字を抽出して その数字を元にDBからデータを引っ張ってこようと思ってます。 // 抽出 $pregresult = preg_match("/[0-9]+/",$result,$match); $id = $match[0]; ここで $id に番号が入り、その番号でSQL文を作成したいのですが 文字列中に[id:xxx]がひとつだけなら正常に動作するのですが 二つ以上存在する場合、$id には最初に検出された数字(上記例では 1 ) しか入ってこないので、二つ目以降のidが認識できず困ってます。 複数の検出・置換対象を順次処理していく方法があれば ご教示いただければ幸いです。 もしくは、他にもっとスマートな方法があるのであれば ご提示いただければ幸いです。 以上、よろしくお願いいたします。

  • PHP
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

>$pregresult = preg_match("/[0-9]+/",$result,$match); preg_match_all にすれば、数字の部分を全部取れるのでは? preg_match_all http://phpspot.net/php/man/php/function.preg-match-all.html

sagancross
質問者

お礼

すっかり preg_match_all の存在を忘れてました… おかげでできました。ありがとうございました。

関連するQ&A

  • 正規表現で置換

    その1 $str = "ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="http://yyy.hoge.jp/hage/hige/xxxx.jpg" width="320" height="240" />ほげほげ"; ↓ $str = "ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="./foo/faa/fii/xxx.jpg" width="320" height="240" />ほげほげ"; その2 $str = "<img src="http://yyy.hoge.jp/hage/hige/xxxx.jpg" width="320" height="240" />ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="http://yyy.hoge.jp/hage/hige/xxxx.jpg" width="320" height="240" />ほげほげ"; ↓ $str = "<img src="./foo/xxxx.jpg" width="320" height="240" />ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="./foo/faa/fii/xxx.jpg" width="320" height="240" />ほげほげ"; このような文字列があった時に、次のように従って置換したいです。 1.imgのタグの内部に、「http://yyy.hoge.jp/hage/hige/xxx.jpg」という文字列があった場合、「./foo/faa/fii/xxx.jpg」という文字列に置き換える。 2.それ以外のURLの場合は置換しない。 3.その1とその2では「xxx.jpg」となっていますが、jpg以外の拡張子の場合も存在する。 4.日本語とURLの位置や個数はバラバラです。 5.URLの中のxxxとyyyは不定の文字列で、hage、hoge、hige、foo、faa、fiiは固定です。 6.使用している言語はPHPです。正規表現を1度だけでできれば理想的ですが、今回は2回に渡った処理でも問題ありません。 以上です。正しく処理できる正規表現、あるいは下記の正規表現の誤りを教えて頂ければ幸いです。 お手数ですが、よろしくお願い致します。 下記の方法では、うまくできませんでした。 $pattern = "/http:\/\/.*?hoge.jp\//"; $replacement = "./"; $str= preg_replace($pattern, $replacement, $str); $pattern2 = '/\/?hage\/hoge/'; $str = preg_replace($pattern2, '/foo/faa/fii', $str);

    • ベストアンサー
    • PHP
  • 正規表現による置換

    HTMLの構文も正規表現もよく理解しないままに作業をしているので とんちんかんなことを言っているのかもしれません 合わせて指摘してもらえると助かります Yahoo pipes 使ってる中で発生している現象です 目的としては HTMLタグから一部の文字列を取り出したく 変換元のXTMLは以下のようなものです(一部加工しています(***** の部分は隠しています) <a rel="nofollow" target="_blank" href="http://*****.html">抽出したい文字列</a> <img alt="new" class="new" height="15" src="http://*****.jpg" width="32"/> に対して 置換対象  .*html">(.*)  置換後  $1   を行ってからさらに 置換対象  (.*)<img.*    置換後  $1  としたところ 一応抽出はできました    本来 2回目は  (.*)</a  の気がするのですが1回目の結果を見るとなぜか</a>    の部分もなくなってしまっています  これも不思議なのですが 2回に分けて行うのは面倒なので1度で行いたいと思い 置換対象  .*html">(.*)<img.* 置換後  $1 としてみたのですが 求めている文字列の抽出をすることができませんでした     .一応 *html">(.*)</a.*  というのもやってみましたが結果は変わりませんでした これは当然の結果ななのか変換(処理)ツールの不具合なのかの判断ができません 分かる人がいたら教えてもらえないでしょうか 情報足りなければ補足させていただきます

  • 正規表現:囲われた文字列の置換

    シングルクオーテーションで囲われた文字列のシングルクオーテーションの前に文字を追加するように、正規表現を用いて置換しようと考えています。 全角文字は[^\x01-\x7E]で検索できるのはわかったのですが、シングルクオーテーションで囲われて、全角文字を含む場合という表現ができません。 下記のような、文字列を対象としています。置換をするのは、全角文字を含む文字列のみです。  全角文字のみ  半角文字のみ  全角半角文字両方 下記ののように置換したいです。 置換前: '全角文字や半角文字','testです','test'.'テスト'.'てすとtest','123' 置換後: A'全角文字や半角文字',A'testです','test'.A'テスト'.A'てすとtest','123' よろしくお願いします。

  • 秀丸で正規表現を使って置換

    あるファイルに関して、このような置換を行いたいです。 abc/xxx,yyy,zzz.html ↓ abc/xxx.html xxxとyyyとzzzはある任意の文字列(英数字で文字数はばらばら)で 「abc/」と「,」と「.html」は固定の文字列になります。 そこで、秀丸で開いて、正規表現による検索で、 「abc/.*,.*,.*.html」 として検索すると、該当部分が検索できることがわかりましたが、置換後をどのように設定すればいいのかわかりません。 置換後のabc/xxx.htmlの「xxx.html」の部分は検索前の任意の文字列をそのまま残したいのです。 秀丸の置換機能でこのようなことは可能でしょうか? 正規表現に関してあまり詳しくないので教えてください。

  • VB2008 正規表現でHTMLタグを"大文字→小文字"に置換したい

    Visual Basic 2008使用のプログラミング初心者です。 HTMLタグを大文字から小文字に置換するアプリケーションを作成中なのですが記述が間違っているのか、文字列を置換することが出来ません。 以下ソースです。     TextBox1.Text = Regex.Replace(TextBox1.Text, _       "<([\/]?)([\w]+)", _       "$1\L$2") http://dobon.net/vb/dotnet/string/regexreplace.html http://www37.atwiki.jp/emeditor/pages/50.html#id_6996d4b6 この二つのサイトを参考にやってみたのですが 置換を実行すると <BR> → \LBR> こうなってしまいます。 小文字に置換されるようにするにはどこを直せばよいのでしょうか。 教えてください、よろしくお願いします。

  • 特定の文字列を含むテキスト置換について

    HTML編集で困っているのでお教え下さい。 ある特定の文字列を含む内容の一部を置換したいのですが、 正規表現の使用できるエディタで作業は可能でしょうか。 例としましては <a href = "xxx/xxx/xxx.pdf> <a href = "yyy/yyy/yyy.html> のような表記で、「pdf」を含む文字列のみ <a onclick href = "xxx/xxx/xxx.pdf> と置換したいのですが。よろしくお願いいたします

  • 文字列の置換

    JAVAであるファイル内の文字列を置換するプログラム(日本語)を作りたいのですが、 ・ ・ String h_s; FileReader h_fr = new FileReader(in_filename); BufferedReader h_br = new BufferedReader(h_fr); while(true){  h_s = h_br.readLine();  if (h_s == null){   break;  }  ●文字列を置換するプログラム● } ・ ・ ここの●文字列を置換するプログラム●にあたる適当な関数って何かありますか? たとえばperlでいうと↓みたいなものなのですが・・・ s/置換前文字/置換後文字/g よろしくお願いします。

    • ベストアンサー
    • Java
  • 文字列置換

    文字列置換 htmlのbody内のタグではない(画面に表示される)特定の文字列を別の文字列に置き換えるコードはどう書けばいいのでしょうか?

  • 急ぎでお願いします!正規表現の置換について

    こんにちわ。 HTMLのコードを置換エディターで一括で書き換えたいと思っています。 例えば <h2 id="01"><img src="../imgs/dish/index_tit_01.gif" alt="サンプル" width="630" height="36" /></h2> というようなコードをaltの文字以外は削除して <h2 id="01">サンプル</h2> にしたい場合、検索する文字列、置換する文字列にはどのような正規表現を適用したらよいでしょうか? また<h2 id="01">が<h2 ="id=02">,<h2 ="id=03">と複数ある場合があるので、 できたらid=数字のところは01,02,03,04などにもまとめて適用させたいと思っています。 どうかご教授よろしくお願いします!!!

  • 正規表現で置換したい

    ブログのシステムを変更して、 記事中にある内部リンクの書き換えが必要となりました。 現在、記事中に post-001.html post-005.html  ・  ・  ・ post-853.html という文字列があります。 数字は飛び飛びでそれぞれ異なり500個ほどあります。 WordPressのプラグインの「Search Regex」を使って置換をしたいのですが、 正規表現で置換して、 ハイフンをアンダーバーに置換し、お尻の「.html」は削除して post_001 post_005  ・  ・  ・ post_853 としたいのですが、正規表現で置換する場合、 どのようにすればいいのでしょうか。 「post-」を ( ) でくくればいいのでしょうか。 「.html」削除するにはどうすればいいのでしょうか。 Search Regex に Search pattern(置換前の文字列)と Replace pattern (置換後も文字列)を入力する欄があります。 上のような文字列を置換したい場合は、 それぞれどのような記号を入力すればよいのでしょうか。 アドバイスをよろしくお願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう