- ベストアンサー
正規表現を使って文字列の置換を短縮する方法
- 正規表現を使用して文字列の置換を短縮する方法について教えてください。
- 例えば、文字列の中で「File」の前の単語を置き換える場合、より短縮された書き方はありますか?
- 現在のコードではパターンの「[A-Z][a-z0-9]*」が重複していると感じています。
- みんなの回答 (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 /> ・・・小文字がない場合は大文字の最後
その他の回答 (4)
- k_yukichan
- ベストアンサー率57% (8/14)
単語の先頭は必ず大文字であるという条件で組みましたが、要件に矛盾が出てきています。 ご質問者さまの要望に応え動くようにしました。 $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 に何が入っているか見てください。 ?>
お礼
ご回答ありがとうございます。 見返してみると誤った用件を言っていました・・・すいません。 改めて説明すると、 「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)
ロジックに矛盾がでてますね "librayMyUtil2File appFile" に小文字からはじまるものもヒットしてよかったら 「Util」ではなく「librayMyUtil2」が引っかかりますよね? もし小文字から始まって、大文字を含まないものだったら「til2」になるし どういうロジックで"Util2 App"が返ってきてほしいのかしっかり考えた方がいいですよ
- k_yukichan
- ベストアンサー率57% (8/14)
回答に誤りがありました。再度、回答します。 申し訳ございません、ご質問を良く読んでいませんでした。 シンプルに記述するなら /(\w*)([A-Z]\w*)File/ で良いかと思います。 ただ、単語の先頭文字が【大文字】であることに注目すると ご質問者様の記述が、後々のメンテナンスで何を記述しようとしたか明示的で、ベストだと私は考えます。
お礼
ご回答ありがとうございます。 そのやり方でできました。ありがとうございます。 新たに先頭が小文字だった場合はどうなるのかという疑問がでてきまして、 一旦締め切って新たに立て直そうか迷ったのですが、同じ正規表現についてなので 最後にもう一度お答え頂けないでしょうか? 今回は変換後は全て大文字(この場合はappがAppになる)にしたいです。 $string = "librayMyUtil2File appFile";//先頭が小文字 $pattern = '';//←ここが知りたい $replacement = '$2'; echo preg_replace($pattern, $replacement, $string);//Util2 A(←大文字に変換されて)pp と表示されたい
- k_yukichan
- ベストアンサー率57% (8/14)
[A-Z][a-z0-9]* は \w* と省略出来ます。 \w は [_a-zA-Z0-9] と等価です。 http://www.rider-n.sakura.ne.jp/regexp/regexp.php
お礼
ご回答ありがとうございます。 まさしく理想とする結果になりました。ありがとうございます。