正規表現を使って文字列の置換を短縮する方法

このQ&Aのポイント
  • 正規表現を使用して文字列の置換を短縮する方法について教えてください。
  • 例えば、文字列の中で「File」の前の単語を置き換える場合、より短縮された書き方はありますか?
  • 現在のコードではパターンの「[A-Z][a-z0-9]*」が重複していると感じています。
回答を見る
  • ベストアンサー

正規表現について教えて下さい

正規表現について教えて下さい $string = "LibrayMyUtil2File AppFile"; $pattern = '/([A-Z][a-z0-9]*)*([A-Z][a-z0-9]*)File/'; $replacement = '$2'; echo preg_replace($pattern, $replacement, $string);//Util2 App と表示される この例のように、「File」の前の単語に置き換えたいのですが、 このやり方だとpatternの「[A-Z][a-z0-9]*」が重複しているのが凡長だと思ってまして もっと短縮された書き方があれば教えてもらいたいです。

  • PHP
  • 回答数5
  • ありがとう数3

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

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

結論として 「<librayMyUtil2File /> <appFile />」を「<Util2 /> <App />」まで持っていけばいいですか? なお、小文字を大文字にするなどプログラム的な置換はe修飾子を使います。 <? $string = "<librayMyUtil2File /> <appFile /> <xxxYYzzzFile /> <XXXFile />"; $pattern = '/([A-Za-z0-9]*?)([A-Z]{0,1}[a-z0-9]*)(File)/e';//appFileにマッチ $replacement="ucwords('\\2')"; $string= preg_replace($pattern, $replacement, $string); print htmlspecialchars($string); ?> 結果 <librayMyUtil2File /> → <Util2 /> ・・・最後の大文字UからはじまるUtil2 <appFile /> → <App /> ・・・大文字がないので最初の小文字からapp <xxxYYzzzFile /> → <Yzzz /> ・・・大文字が重なる場合は最後の大文字 <XXXFile /> → <X /> ・・・小文字がない場合は大文字の最後

takagoo100
質問者

お礼

ご回答ありがとうございます。 まさしく理想とする結果になりました。ありがとうございます。

その他の回答 (4)

回答No.4

単語の先頭は必ず大文字であるという条件で組みましたが、要件に矛盾が出てきています。 ご質問者さまの要望に応え動くようにしました。 $string = 'librayMyUtil2File appFile'; // 先頭の文字が小文字であっても $string = 'LibrayMyUtil2File appFile'; // 先頭の文字が大文字であっても $string = 'LibrayMyUtil2file appFile'; // 数字のあとの単語が小文字であっても 動くことは動きます。ただし他の回答者さまがおっしゃっているとおり、要件がブレないようにシステムを完成させてください☆ <?php //6039408.sample.php // 任意の単語を小文字にする $string = "librayMyUtil2file AppFile"; $pattern = '/(([A-Z]|[a-z])[a-z]*\d*)/'; preg_match_all($pattern, $string, $match); echo($match[0][2] . ' ' .strtolower($match[0][4])); // → Util2 app と出力 // strtolower 関数で小文字に変換 print_r($match); // → $match に何が入っているか見てください。 ?>

takagoo100
質問者

お礼

ご回答ありがとうございます。 見返してみると誤った用件を言っていました・・・すいません。 改めて説明すると、 「File」という単語の前の単語が、先頭が小文字と大文字の場合があり 大文字の場合は「librayMyUtil2File」とか「librayMyMy2UtilFile」とかで それぞれを「Util2」と「Util」に変換したい。 小文字の場合は「appFile」や「bbsFile」という「File」の前が先頭が小文字の1単語だけのケースで それぞれを「App」と「Bbs」に変換したい。 それを実現するためには $string = "<librayMyUtil2File /> <appFile />"; $pattern = '/([a-z][a-z0-9]*([A-Z][a-z0-9]+)+)([A-Z][a-z0-9]+)File/';//librayMyUtil2Fileにマッチ $replacement = '$3'; $string = preg_replace($pattern, $replacement, $string);//この段階で <Util2 /> <appFile /> になってるはず $pattern = '/([a-z][a-z0-9]*)File/';//appFileにマッチ $replacement = '$1'; echo preg_replace($pattern, $replacement, $string);//この段階で <Util2 /> <app /> になってるのですが、appを大文字にする方法が思いつきません・・・。$replacementをstrtoupper($replacement)で試したのですが当然ですができませんでした。どうすれば? という2段階でできるのですが、これをなんとか一回の正規表現でやりたいのです。 それにはpatternに「|」を使えばよいのかな?と思って試したのですが、なかなか思った通りにはできませんでした・・・。 以上のような用件なのですが、どのようにpattern記述すれば一回で変換できるのでしょうか?

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

ロジックに矛盾がでてますね "librayMyUtil2File appFile" に小文字からはじまるものもヒットしてよかったら 「Util」ではなく「librayMyUtil2」が引っかかりますよね? もし小文字から始まって、大文字を含まないものだったら「til2」になるし どういうロジックで"Util2 App"が返ってきてほしいのかしっかり考えた方がいいですよ

回答No.2

回答に誤りがありました。再度、回答します。 申し訳ございません、ご質問を良く読んでいませんでした。 シンプルに記述するなら /(\w*)([A-Z]\w*)File/ で良いかと思います。 ただ、単語の先頭文字が【大文字】であることに注目すると ご質問者様の記述が、後々のメンテナンスで何を記述しようとしたか明示的で、ベストだと私は考えます。

takagoo100
質問者

お礼

ご回答ありがとうございます。 そのやり方でできました。ありがとうございます。 新たに先頭が小文字だった場合はどうなるのかという疑問がでてきまして、 一旦締め切って新たに立て直そうか迷ったのですが、同じ正規表現についてなので 最後にもう一度お答え頂けないでしょうか? 今回は変換後は全て大文字(この場合はappがAppになる)にしたいです。 $string = "librayMyUtil2File appFile";//先頭が小文字 $pattern = '';//←ここが知りたい $replacement = '$2'; echo preg_replace($pattern, $replacement, $string);//Util2 A(←大文字に変換されて)pp と表示されたい

回答No.1

[A-Z][a-z0-9]* は \w* と省略出来ます。 \w は [_a-zA-Z0-9] と等価です。 http://www.rider-n.sakura.ne.jp/regexp/regexp.php

関連するQ&A

  • preg_replaceでの正規表現について

    お世話になります。 ereg_replace で書いた正規表現による置換処理を、 preg_replace に置き換えようとしています。 (preg_replaceの方が処理が速いとマニュアルにあったので) ところが、preg_replaceでの正規表現検索がうまくいかないで困っています。 基本的には、ereg_replaceの正規表現部分を//で囲んでいるだけです。 具体的には、下記のような処理を書いています。 間違いがあれば、ご指摘いただけましたら幸いです。 //### うまくいっている ereg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='\{dokuji tag\}.+\{_dokuji tag\}'; $replace=''; $html=ereg_replace($search,$replace,$html); //不要部分の削除 //### うまくいっている ereg_replace のパターン ここまで ### ↓ //### うまくいかない preg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='/\{dokuji tag\}.+\{_dokuji tag\}/m'; $replace=''; $html=preg_replace($search,$replace,$html); //不要部分の削除 //### うまくいかない preg_replace のパターン ここまで ### //### 置き換えるソース('template/temple.html') ここから ### <!-- {dokuji tag} --> <tr> <td nowrap><strong>タイトル:</strong></td> <td> <input type="text" name="name" size="80" value="{name}" /> </td> </tr> <!-- {_dokuji tag} --> //### 置き換えるソース('template/temple.html') ここまで ### よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 文字列の否定の正規表現

    文字列の否定の正規表現 次のような「File」の前の文字列を大文字に置き換えるという文で 「common」という文字列だけはそのまま置き換えないようにしたいのですが、 $string = "commonFile aaFile"; $pattern = '/(\w+)(?![common])(File)/e'; $replacement="ucwords('\\1')"; $string = preg_replace($pattern, $replacement, $string); print htmlspecialchars($string); //Common Aa と表示される このやり方だと「\w+」が効いてるせいなのか先読み否定の「?![common]」が効いてくれません・・・ $pattern = '/(aa)(?![common])(File)/e'; print htmlspecialchars($string); //commonFile Aa と理想とする結果が表示される と具体的な文字列だと要求どおりになるのですが、 そうではなくて「File」の前が「common」の時だけ無視して欲しいのです。 どのように記述すれば良いのでしょうか?

    • ベストアンサー
    • PHP
  • PHPのpreg_replaceについて

    文字列に半角、全角があったら''に置換したいです。 例)あ あ あ -> あああ 上記のように。 ソースは下記のとおりしてみたのですがうまく表示されませんでした。 $string = 'あ あ あ'; $pattern = '[ \t\n\r\f]'; $replacement = ''; $var_dump(preg_replace($pattern,$replacement, $string)); 他には $string = 'あ あ あ'; $pattern = '[[:space:]]'; $replacement = ''; $var_dump(preg_replace($pattern,$replacement, $string)); などと行ってみました。 ご教授お願いいたします。

    • 締切済み
    • PHP
  • 2つの正規表現の違いは?

    次の正規表現を使った置換の違いがよく分かりません。 $strString="abcd<!--s_1-->うほほ<!--e_1-->efg"; echo preg_replace("/<!--s_1-->.*<!--e_1-->/","<!--s_1-->なんと<!--e_1-->",$strString); $strString="abcd<!--s_1-->うほほ<!--e_1-->efg"; echo preg_replace("/<!--s_1-->.*?<!--e_1-->/","<!--s_1-->なんと<!--e_1-->",$strString); .*  と .*? なんですが、どういったところで違いがでるのでしょうか?

    • 締切済み
    • PHP
  • htmlタグを削除させて表示させたい

    特定の変数内にある、htmlタグを削除させて表示させたいのですが、reg_replace()を使うのが妥当でしょうか? その際、<br>や<img ="http=~">といった< >内が変化する文字を指定するのがわからなくて困っています。 <?php $string = 'こんにちは、<br>皆さん.'; $pattern = '/<br>/'; $replacement = ''; echo preg_replace($pattern, $replacement, $string); ?> この</br/>の部分を</*/>としてみましたが見当違いのようで"皆さん"の部分がすっぽ抜けてしまいました。 もしご存知の方おられましたら、どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • ['SERVER_NAME']と正規表現について

    下記の意味が分かりません。 ( !empty($_SERVER['SERVER_NAME']) && preg_match('#^(?:[a-z0-9\-]+\.){1,}[a-z]{2,}$#i', $_SERVER['SERVER_NAME']) ) ? preg_replace('#^www\.#', '.', $_SERVER['SERVER_NAME']) : ''; <分かる範囲> $_SERVER['SERVER_NAME']が空ではなく、かつ、$_SERVER['SERVER_NAME']の中に'#^(?:[a-z0-9\-]+\.){1,}[a-z]{2,}$#i'があったら、$_SERVER['SERVER_NAME']の中の'#^www\.#'を'.'へ置き換え <知りたいこと> 正規表現の所の意味と、結局、この一文で何をしようとしている(と予想される)か、教えてください

    • ベストアンサー
    • PHP
  • preg_replace()でマッチ文字列に関数を

    PHPでのpreg_replace()でマッチした文字列に関数を適用したいのですが、上手くいきません。 $str = "hogeHoge"; $pattern = '/(h.ge)/i'; $replacement = strtoupper("$1"); echo preg_replace($pattern, $replacement, $str); // 期待する結果 : HOGEHOGE // 実行した結果 : hogeHoge 根本的に間違っているかもしれませんが、ご指南いただければ幸いです。

    • ベストアンサー
    • PHP
  • 正規表現の読み方

    /{(.+?)}/e この正規表現はどのような意味でしょうか? 下記のようなプログラム(テンプレートエンジン)に使われています display('index.html', $prm); function display($tpl, $prm) { $html = file_get_contents($tpl); $html = preg_replace('/{(.+?)}/e', '$prm[\'$1\']', $html); echo $html; }

    • ベストアンサー
    • PHP
  • PHP正規表現の難題・preg_replaceでイメージタグをリンクタグに…

    PHPのpreg_replaceを使用して、 imgタグをaタグに置換するプログラムで躓いています。 全てのパターン$hogeで適用される正規表現をかけません。 (※現在パターン1のみ出来ない状況で困っています) 間違い箇所ありましたらご教授下さい。 ■パターン1 $hoge = '<img src="http://test.jp/test.gif" class="test" style="border:none;" />'; ■パターン2 $hoge = '<img src="http://test.jp/test.gif">'; ■パターン3 $hoge = '<img width="100" src="http://test.jp/test.gif">'; preg_replace('/\<img(.*)src=\"?(http[\-_\.\!\~\*\'\(\)a-z0-9\;\/\?\:@&=\+\$\,\%\#]+(jpg|jpeg|gif|png|bmp))\"(.*)\>/i',"<a href='\\2'>link</a>",$hoge); どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • 画像の置換え

    プログラム初心者です 番号と画像拡張子を簡単な正規表現で表す方法をおしえてください 拡張子はgif、png、jpgの拡張子です 番号は桁数も番号も変わります。この三パターンにマッチするテキストを置き換えたいです 例 56.gif 100.gif 6.png 6549.png 79169.jpg 35.jpg $pattern="/(\d+)/"; $replacement="<a href=\"$0\">$0</a>"; if(preg_match($pattern,$mes,$matches) ){ $mes=preg_replace($pattern,$replacement,$mes); } よろしくお願いします

    • ベストアンサー
    • PHP

専門家に質問してみよう