PHPで正規表現を使って日付の数字部分を<span>で囲む方法

このQ&Aのポイント
  • PHPで正規表現を使って、日付の文字列から年/月/日の数字部分を<span>で囲む方法を教えてください。必要なのは、月と日をゼロ埋めなしの1~2桁で表示し、年は必ず4桁で表示することです。
  • 具体的な例として、2011年5月12日(木)~6月1日(水)のような文字列から、以下のように数字部分を<span>で囲みたいです。例えば、年は<span class="y">2011</span>年、月は<span class="m">5</span>月、日は<span class="d">12</span>日(木)のように表示したいです。
  • 上記の要件を満たすためには、正規表現の置き換えを使う方法があります。ただし、正規表現が苦手であるため、アドバイスを求めています。PHPのバージョンは5.2.5です。
回答を見る
  • ベストアンサー

正規表現の書き方教えてください(PHP)

PHPで、以下の例のように、日付の文字列から年/月/日の数字部分をそれぞれ、<span>で囲みたいです。 正規表現の置き換えで出来ると思うのですが、正規表現が苦手なため苦戦しております。 どなたかアドバイスいただけると助かります。 (例) 2011年5月12日(木)~6月1日(水) ↓ [A] <span class="y">2011</span>年 <span class="m">5</span>月 <span class="d">12</span>日(木)~ <span class="m">6</span>月 <span class="d">1</span>日(水) もしくは [B] <span class="y">2011</span>年 <span class="md">5</span>月 <span class="md">12</span>日(木)~ <span class="md">6</span>月 <span class="md">1</span>日(水) [A]と[B]で、速度がそれほど変わらなければ[A]のようにしたいです。 年と月は入ったり入らなかったりします。 月と日はゼロ埋めなしの1~2桁、年は必ず4桁です。 PHPのバージョンは5.2.5です。

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

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

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

正確にはUTFでやることになりますが、ひとまずこれで動くと思います。 <? $str="test2011年5月12日(木)~6月1日(水)test"; $pattern="/(\d+)年(\d+)月(\d+)日((.+?))~(\d+)月(\d+)日((.+?))/"; $replacement="<span class=\"y\">\\1</span>年\n<span class=\"m\">\\2</span>月\n<span class=\"d\">\\3</span>日(\\4)~\n<span class=\"m\">\\5</span>月\n<span class=\"d\">\\6</span>日(\\7)"; $str=preg_replace($pattern,$replacement,$str); //print $str; print nl2br(htmlspecialchars($str)); ?>

sr-ki
質問者

お礼

お礼が大変遅くなり失礼しました。 ご回答を参考にさせていただき何とかうまく解決しました。 どうもありがとうございました。

関連するQ&A

  • 正規表現について

    変数の文字列を範囲指定して削除しようとしています。 正規表現を使って範囲指定したいのですが、うまくいきません。 <span class="shimei"> ~ </span> というのは正規表現でどのように書くのでしょうか? $name = mb_ereg_replace("<span class=\"shimei\">.*</span>","",$name); これはどこが間違っているのでしょうか?

    • ベストアンサー
    • PHP
  • PHP 正規表現の書き方おしえてください!

    PHP&正規表現初心者です。 ヤフーファイナンスランキングから順位ごとに株価データを取得したいの ですが、正規表現の書き方がわからず意図したデータが取得できません。 ご教授ください。 ソース ************************************************ ~ <tbody> <tr class="rankingTabledata yjM"> <td class="txtcenter">1</td><td class="txtcenter"> <a href="http://stocks.finance.yahoo.co.jp/stocks/detail/?code=0002.t">0002</a></td> <td class="txtcenter yjSt">東証JQS</td> <td class="normal yjSt">(株)シxダー</td> <td class="txtcenter grey yjSt">12/18</td> <td class="txtright bold">313</td> <td class="txtright bgyellow02"><span class="greenFin">+23.72</span>%</td> <td class="txtright bgyellow03"><span class="greenFin">+60</span></td> <td class="txtright">5,917,300</td> <td class="txtcenter yjSt"> <a href="http://textream.yahoo.co.jp/rd/finance/0002">掲示板</a></td></tr> <tr class="rankingTabledata yjM"> <td class="txtcenter">2</td><td class="txtcenter"> <a href="http://stocks.finance.yahoo.co.jp/stocks/detail/?code=0003.t">0003</a></td> <td class="txtcenter yjSt">マザーズ</td> <td class="normal yjSt">(株)リxアワールド</td> <td class="txtcenter grey yjSt">12/18</td> <td class="txtright bold">2,125</td> <td class="txtright bgyellow02"><span class="greenFin">+23.19</span>%</td> <td class="txtright bgyellow03"><span class="greenFin">+400</span></td> <td class="txtright">6,800</td> <td class="txtcenter yjSt"> <a href="http://textream.yahoo.co.jp/rd/finance/0003">掲示板</a></td></tr> <tr class="rankingTabledata yjM"> <td class="txtcenter">3</td> ~ *********************************************** ソースはこんな感です。 ↓私のクソ文章 $n = preg_match_all("{<tr class=\"rankingTabledata yjM\"><td class=\"txtcenter\">(.*)</td><td class=\"txtcenter\"><a href=.*>(.*)</a>}", $feed, $cell, PREG_PATTERN_ORDER); preg_match_allで配列に格納して表示させたいのですが、 うまくいきません。 echo "1位  " . $cell[1][0] . " " . $cell[1][1] . " " . $cell[1][2] .....??"\n"; echo "2位  " . $cell[1][1] . "\n" ?????; ~ ???3次配列ですか?? 混乱します。 ☆☆☆理想☆☆☆☆ 1位 2435 東証JQS (株)シダー 12/18 313 +23.72 % +60 5,917,300 2 位 3691 マザーズ (株)リアルワールド 12/18 2,125 +23.19% +400 6,800 ~ ☆☆☆☆☆☆☆☆☆ 取得した株価コードから別サイトを検索したいので 各項目ごとに別要素で表示させたいです。 ダメダメなので よろしくおねがいします。

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

    phpの正規表現についてです。 よく入力されたメール・パスワードを判定するのに正規表現で判定させますが、今回の指定する条件は… ・半角英数、0~9の組み合わせ ・使用禁止文字は \ ' @ [ ] の5つ ・入力は8文字以内 例 if(ereg("^[0-9a-z\!\"\#\$\%\&\(\)\=\-\~\|\{\}\;\:\+\*\,\.\/\<\>\?\_]{1,8}$", $pw)){ 記号の意味でよくわからないのがあるのですが、 { }は文字数を指定するものでよろしいのでしょうか? {1,8} は1~8文字までという意味? \が入ると認証が通ってしまってい、困っています。 ユーザーの入力    MySQLの取得結果 例 123\        → データが入らない   \123        → 123   \\123        → \123   123\123      → 123123   \\          → \ といった不具合になってしまい、MySQL側でも入力されたデータと異なったデータが入ってしまいます。\が入っても認証されないようにするにはどうすればいいんでしょうか? 正規表現の参考にしたサイトは http://itbtech.itboost.co.jp/php/php_06.php です。アドバイスよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPでの正規表現

    PHPでの正規表現 下記のようなソースがあり、「備考情報・・・」の部分だけを抽出する正規表現がわからず困っております。 -------sample code------- <div class="product"> <strong>商品情報:</strong> </div> <div class="comment"> <strong>備考:</strong>&nbsp; 備考情報・・・・・ </div>   :   : -------sample code------- 以下のような正規表現を書いてみましたが、上手くいきませんでした。 「<strong>備考.* ([^\n]+)」 「<strong>備考:</strong>&nbsp;」の次の行の情報で、改行されるまでの情報を取得したいと考えております。 何度か試みても&nbsp;のコードや改行コードの取得、判定がうまくいかず、頭を抱えている次第でございます。 どなたかご教授いただけますと幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現について教えてください

    こんにちは。 PHPの正規表現を使用して、あるサイトのhtmlソースから特定のタグ間にある文字を抜き取りたいです。 例えば、下記の場合9を抜き取りたいです。 <div class="a">9</div> この場合の処理方法を教えてください。

    • 締切済み
    • PHP
  • PHPでの正規表現

    PHPでの正規表現に関する質問です。 function makeAk($value){ return preg_replace("/(?<![一-龠+ぁ-ん+ァ-ヴ+a-zA-Z0-9'\"#@=:;])@([一-龠+ぁ-ん+ァ-ヴ+a-zA-Z0-9_]{1,15})/u", "@<a href=\"mypage.php/\\1\">\\1</a>", $value); } 上記のコードでmypage.phpに\\1ではなく、パラメーター(?id=$post['id']のような)を振りたいのですが、 どうしたらうまくいきますでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP
  • 正規表現で動的ページを静的ページに見せたい!

    正規表現で動的ページを静的ページに見せたい! 次のように動的ページを静的ページにしたと考えています。 動的ページ:http://www.mysite.com/myindex.php?year=2010&mon=08&day=06↓ ↓ 静的ページ:http://www.mysite.com/myindex/20100806.html 2010は西暦(4桁)、08は月(2桁)、06は日(2桁)を表す。 .htaccessで正規表現を次のように記述しましたがうまく動作しません。 ご教示いただけますよう宜しくお願いします。 RewriteEngine on RewiteRule ^/myindex/([0-9]+{4})([0-9]+{2})([0-9]+{2}).html$ /myindex.php?year=$1&mon=$2&day=$3[L]

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

    HTMLファイルを読み込み、特定の文字列にリンクを付けて出力したいのですが上手くいきません。 例: <img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に正規表現を知りたい方は、<a href="special.html">正規表現の詳しい説明</a>をクリックして下さい。  ↓正規表現をキーワードにしてリンクを付けたい。 正:<img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に<a href="seiki_hyougen.html">正規表現</a>を知りたい方は、<a href="special.html">正規表現の詳しい説明</a>をクリックして下さい。 誤:<img src="./seiki_hyougen.gif" alt="<a href="seiki_hyougen.html">正規表現</a>についての説明">更に<a href="seiki_hyougen.html">正規表現</a>を知りたい方は、<a href="special.html"><a href="seiki_hyougen.html">正規表現</a>の詳しい説明</a>をクリックして下さい。 尚、下記URLのサンプルを参考にしてスクリプトを作成しています。 http://php.oss.eznetsols.org/manual/ja/function.preg-split.php $r = preg_split('((\/a>)|(<a))', $html, -1, PREG_SPLIT_DELIM_CAPTURE); for ($i = 0; $i < count($r); $i++) { if ($r[$i] == "<a") { $i++; continue; } $r[$i] = preg_replace( "/(正規表現)/i", "<a href='seiki_hyougen.html'>\\1</a>", $r[$i] ); } return join("", $r); この(正規表現)の部分で上手い正規表現を使えばalt="×××"の中にリンクタグが入らないようにできるのでは?と思っているのですが・・・。 どうか、良い方法を教えて下さい。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP、正規表現の使い方

    PHPで特定の文字列から特定の文字までを削除したいのですが、 正規表現を使うということはわかりましたが、どのようにしていいかがいまいちわかりません。 http://www.sample.php?a=test&b=ex&c=sample という文字列があったとして、 &b=exを取り除きたい場合はどのようにしたらいいのでしょうか。 mb_ereg_matchを使用しようと思っていますが、 その他の方法があればそちらも教えてください。

    • ベストアンサー
    • PHP
  • 正規表現

    数字と大文字、小文字のアルファベットは入力OK。 記号も入力OK。でも、記号の中でも「”」、「.」は ダメ。しかも、10桁くらい入力できるようにする。 を表す正規表現は [a-zA-Z0-9&&[\"\.]]* と思ったのですが、 正しく表す正規表現はどの様なものになるのでしょうか? お願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう