PHPで正規表現でマッチした値を計算して元の位置に

このQ&Aのポイント
  • PHPで、あるテキストの中から条件にマッチした部分を抽出してその値を計算した物を元の位置に戻す処理が可能でしょうか?
  • 具体的には、テキスト中の特定のパターンにマッチする部分を抽出し、その値に2を掛けた結果を元の位置に置き換えたいです。
  • ただし、数字部分はランダムなので、決めうちでの単純な文字列置き換えでは対応できません。
回答を見る
  • ベストアンサー

PHPで正規表現でマッチした値を計算して元の位置に

PHPで、あるテキストの中から条件にマッチした部分(今回は"["と"]"で囲まれた8桁の数字)を抽出してその値を計算した物を元の位置に戻すといった処理をしたいのですが可能でしょうか? 言葉では分かりづらいのですが、以下の例ような処理がしたいです。  あいうえおあい[11111111]、かき[22222222]、さしす[33333333] このテキストの中の8桁の数字それぞれにに2を掛けて...  あいうえおあい22222222、かき33333333、さしす66666666 というテキストに置き換えたいです。 数字部分はランダムなので、決めうちでの単純な文字列置き換えでは対応できません。 (数字部分を抽出する正規表現の書き方は分かります)

  • sr-ki
  • お礼率68% (43/63)
  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>「エラーなど一切無視して」というのはどういうことでしょうか? エラー処理など考慮していませんということです。 エラーが出た場合は別途対応が必要です。 >$replacement="'\\1'*2"; 正規表現のパターンマッチでいうとマッチする箇所が まず0番目の要素になりカッコがついている箇所が1番目の要素になります。 $pattern="/\[(\d*?)\]/ue";を例にみれば\\1とは、 1番目の要素=かぎカッコで囲まれた\d*?の箇所=数字の羅列箇所 となり、それに2を掛けているということです。 >どちらの方法の方が処理が早いでしょうか? preg_replace()自体、マッチした箇所を入れ替える処理ですから フロー的にもpreg_replace()でやった方がわかりやすいと思いますよ。

sr-ki
質問者

お礼

再度のご回答ありがとうございます。 よく理解できました。 教えていただいた方法でうまくいきました! どうもありがとうございました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

エラーなど一切無視しててっとりばやくはe修飾子をつかいます <?PHP /* UTF8でやること */ $str="あいうえおあい[11111111]、かき[22222222]、さしす[33333333]"; $pattern="/\[(\d*?)\]/ue"; $replacement="'\\1'*2"; $str=preg_replace($pattern,$replacement,$str); print $str; ?>

sr-ki
質問者

お礼

ご回答ありがとうございます! こんな方法があるのは知りませんでした。 大変勉強になります。 「エラーなど一切無視して」というのはどういうことでしょうか? それともう一箇所わからない部分があるのですが、 $replacement="'\\1'*2"; この行の正規表現の内容がわかりません。何かに2を掛けているのはわかるのですが、その前の部分はどのような意味があるのでしょうか? そして、その後自分でも考えてみたのですが、以下のようにすることでも一応希望の動作はできました。 どちらの方法の方が処理が早いでしょうか? <?php $str="あいうえおあい[11111111]、かき[22222222]、さしす[33333333]"; preg_match_all("/\[(\d*?)\]/",$str,$out,PREG_PATTERN_ORDER); foreach($out[0] as $s) { $t = str_replace(array('[',']'),'',$s); $u = $t*2; $out = str_replace($s,$u,$out); } print $out; ?>

関連するQ&A

  • PHP 正規表現

    はじめまして^^ 現在、PHPでプログラムを作っています。 そして、文字列の置き換えをする機会があり、 正規表現をつかうことになりました!! 置き換えに使う関数は、mb_ereg_replaceです! ある条件にあった部分の文字列を置き換えしたいと思っています。 そして、いろいろとやっていきましたら、あるひとつの壁にぶつかりました。。 例えば、PHPでは、正規表現の部分を [^文字]とやると、『文』と『字』という文字列以外にマッチという意味になるらしいのですが、 『文字』という文字列以外にマッチ、というふうに、表現したい場合は、 どう表現すればよいのですか? [^(文字)]とか、その他いろいろ、 自分なりに、色々ためしたのですが、うんともすんともいいません、、 どなたか、わかる方教えて下さいm(_ _)m

    • ベストアンサー
    • PHP
  • 正規表現について

    いま.Netで正規表現にチャレンジしているのですが、どこが問題なのか分からず、投稿させていただきました。 正規表現のパターンです。 \\[Cc]\[(?<$0>[0-9]+),(?<$1>[0-9]+),(?<$2>[0-9]+)\] で、マッチさせたい文字列は、 \C[255,255,255] です。「[255,255,255]」の数字の部分は、一桁から三桁までの数字であれば何でもOKです。 マッチしないことは、http://jsregex.com/を使って調べました。 どうぞよろしくお願いします。

  • [15]にマッチする正規表現

    [15]にマッチする正規表現 [15] にマッチする正規表現を書きたいのですが、うまくいきません。。。。 簡単だ、と思ったのですが。。。 expr "$DATA1" : .*\[15\].* と書くと、中の数字が15じゃなくてもマッチしてしまいます。 expr "$DATA1" : .*15.* であれば"15"にマッチしますが、対象の文字列の都合上、カッコでも識別する必要があり 困っております。[と]をエスケープする目的で\をつける、と思っているのですが、何か 思い違いをしているのでしょうか。

  • vbaの正規表現で、マッチした一部分を抽出したい

    accessの正規表現で、マッチした部分の一部を取り出したいと思っています。 秀丸で言えば、 ------------------------ 文字列 あいうえお ↓↓↓ 正規表現 あ(.*)お 置き換え文字 \1 ↓↓↓ 抽出 いうえ ------------------------ って感じの「¥1」みたいなのがほしいと考えています。 現在、下記のような感じで、対象文字を抽出しています。 ここから、また正規表現でほしい部分を抽出しなければいけないのでしょうか? 【上の例で言えば、「あいうえお」を抽出する関数】 ------------------------ Function 抜き出し(ByVal 指定文字列 As String) As String Dim 正規表現, 一致集団, 一致要素 Set 正規表現 = CreateObject("VBScript.RegExp") 正規表現.Pattern = "購入日時[0-9]{4}年[0-9]{1,2}月[0-9]{1,2}日 [0-9]{1,2}時[0-9]{1,2}分" 正規表現.MultiLine = True Set 一致集団 = 正規表現.Execute(指定文字列) For Each 一致要素 In 一致集団 抜き出し = 一致要素.Value Exit For Next End Function ------------------------ これだと、 購入日時2012年1月25日 17時53分 がマッチします。 でもほしいのは、 2012年1月25日 17時53分 の部分だけ。 何かいい方法は無いでしょうか? よろしくお願いします。

  • 漢字を含んだ正規表現

    お世話になってます。 漢字を含んだ文字列を正規表現でマッチさせたいのですが 以下のようなテキストから 「あいうえおあいうえお、あいうえおあいうえお、あいうえおあい あいうえおあいうえお、あいうえおあいうえお、あいうえおあいう hello,my name is tetetあいうえおあいうえおeららららら frisk02様あえおあいうえお、あいうえおあいうえお、あいうえお」 「frisk02様」もしくは「frisk02」(この部分は英字もしくは数字を含んだ文字列となります)をマッチして取得したいのですが 有効な正規表現がわかりません、教えてください。お願いします。

    • 締切済み
    • PHP
  • PHP 正規表現 文字列抽出

    PHP 正規表現 文字列抽出のご質問です。 ある文字列の中から「○○%OFF」の○○の部分を抽出したいのですが。 分かる方いらっしゃったら、ご教授ください。

    • 締切済み
    • PHP
  • PHPの正規表現「ereg」で特定の数字範囲をマッチさせたい

    PHPの正規表現「ereg」で特定の数字範囲をマッチさせたい 宜しくお願い致します。 PHPの正規表現で、0~99までの数字があり、そのうち、「4~6」と「11~15」までの数字以外の場合にマッチさせる正規表現について教えて下さい。 自分なりに作ってみた正規表現パターンは下記の通りです。 ereg("([^4-6]{1})|[^11-15])",$hoge) もしくは ereg("([^4-6]{1})|[^11-15]{2})",$hoge) で試してみましたが、「4~6」はマッチしないのですが、「11~15」の時にもマッチしてしまいます。 どうすればいいのか、どなたか助けて下さいー!

    • ベストアンサー
    • PHP
  • PHPの正規表現「preg_match」で漢字を含む場合のマッチパター

    PHPの正規表現「preg_match」で漢字を含む場合のマッチパターンについて 宜しくお願い致します。 preg_matchを使っての正規表現で、「あいうえおかきくけこ3月10日さしすせそ」という文字列から「3月10日」だけを抽出するには、どういうパターンが良いのでしょうか? 下記の様にやってみましたが、だめでした。。。 preg_match("/\d{1,2}[月]\d{1,2}[日]/",$hoge,$match) これではうまくいきません。 どなたかお助けくださいー!

    • ベストアンサー
    • PHP
  • PHP5の正規表現でうまくマッチできない

    PHP5の正規表現で文字列中の独自タグをパースしようとしていて、 うまくいかず困り果てています。 正規表現パターンは、/<tag>.*<\/tag>/ 対象文字列は、<tag>こんにちは</tag><tag>こんばんは</tag> preg_match_all('/<tag>.*<\/tag>/', '<tag>こんにちは</tag><tag>こんばんは</tag>', $result) でマッチした文字列は、 $result[0]:<tag>こんにちは</tag> $result[1]:<tag>こんばんは</tag> となることを期待しているのですが、 実際は、 $result[0]:<tag>こんにちは</tag><tag>こんばんは</tag> となりました。 <tag>タグの間に入る文字列長、文字列フォーマットは不定です。 どうすれば期待通りの振る舞いに出来るでしょうか?

    • ベストアンサー
    • PHP
  • 正規表現にマッチした文字列の抽出

    閲覧頂きありがとうございます。 Linuxのsedコマンドに該当するwindowsコマンドは存在しますでしょうか? 存在しない場合、batやマクロでの長い記述となってしまっても構いません。 検索で調べたところ、特定のdllを入れればsedを使用できるとあったのですが、その方法は取りたくありません。 100万行以上あるテキストファイル(一行=一レコード)の中から、正規表現とマッチする文字列の抽出作業です。 1行に1つ、不特定な場所にその文字列が存在するという形です。 その抽出した文字列を、別のテキストファイルへ吐き出す…といった処理を想定しています。 どうかご教示いただけると幸いです。 環境 windows7、EmEditor使用

専門家に質問してみよう