質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • PHP

    20874questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPで、コメント内の2パターンの置換処理について

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 661

mari.rinn

score 17

他のQ&Aのところで質問させてもらってたのですが、最終的な回答がつかずで、少し急いでいるためこちらで質問させてください。
やりたいことは、掲示板の書き込まれたコメント内に、URLが入っていた場合自動リンクにする処理と、同じコメント内に、 >○○さん  という文字列が入っていた場合この文字列を太字にする
ということがやりたくて関数を書いたのですが、URLの方はちゃんと反映されるのですが、太字にする方が出来ません。エラーメッセージは出ていません。(ちなみに、○○部分に > も さん も入ることはないのでそこの細かいチェックは必要ないです)
コードについてですが、

mySQLに保存しているコメントをSQL文で呼び出して$mojiretu2_2 というのに代入しています。

該当のソースコード

if (!function_exists('change2')) {
function change2($mojiretu2_2){ 
$keyword_start = '>';
$keyword_end = 'さん';
 if(preg_match("/(http|https):\/\/[-\w\.]+(:\d+)?(\/[^\s]*)?/",$mojiretu2_2)){
   preg_match_all("/(http|https):\/\/[-\w\.]+(:\d+)?(\/[^\s]*)?/",$mojiretu2_2,$pattarn2);
     foreach ($pattarn2[0] as $key2=>$val2){
      $replace2[] = "<a href='".$val2."' target='_blank' style='font-size:0.9em;'>".$val2."</a>";

}
       $mojiretu2_2 = str_replace($pattarn2[0],$replace2,$mojiretu2_2);

} else if(preg_match("/'.preg_quote($keyword_start).'.*'.preg_quote($keyword_end).'/",$mojiretu2_2)){
   preg_match_all("/'.preg_quote($keyword_start).'.*'.preg_quote($keyword_end).'/",$mojiretu2_2,$match);
foreach ($match[0] as $key3=>$val3){
$futoji[] = "<span style='font-weight:bold;'>".$val3."</span>";
}
       $mojiretu2_2 = str_replace($match[0],$futoji,$mojiretu2_2);

}
return $mojiretu2_2;
}
}
     $mes2_2 = change2($mojiretu2_2);

試したこと

関数を2つ別のに分けて、
$mes2_2 = change2($mojiertu2_2).change3($mojiretu2_2);
としてみたら、文字列が太字にはなったのですが、URLの自動リンクがきかないのと、2重書き込みみたいなことになってしまいました。

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

if ( !function_exists( 'h' ) ) {
    function h( $str ) { return htmlspecialchars( $str, ENT_QUOTES, 'UTF-8' ); }
}

function change2( $text ){ 
    $pattern_url = "/(http|https):\/\/[-\w\.]+(:\d+)?(\/[^\s]*)?/";
    if( preg_match( $pattern_url, $text ) ) {
        preg_match_all( $pattern_url, $text, $much_url );
        foreach ( $much_url[ 0 ] as $key => $val ){
            $replace1 = "<a href='".h( $val )."' target='_blank' style='font-size:0.9em;'>".h( $val )."</a>";
            $text = str_replace( $val, $replace1, $text );
        }
    }
    $pattern_name = "/>.*さん/";
    if ( preg_match( $pattern_name, $text ) ) {
        preg_match_all( $pattern_name, $text, $much_name );
        foreach ( $much_name[ 0 ] as $key => $val ){
            $replace2 = "<span style='font-weight:bold;'>".h( $val )."</span>";
            $text = str_replace( $val, $replace2, $text );
        }
    }
    return $text;
}
$mes2_2 = change2( $mojiretu2_2 );

こうするとかでどうでしょうか。(すいませんが未テストです)

function changeX( $text ){ 
    $text = preg_replace( "/(http|https):\/\/[-\w\.]+(:\d+)?(\/[^\s]*)?/", "<a href='$0' target='_blank' style='font-size:0.9em;'>$0</a>", $text );
    $text = preg_replace( "/>.*さん/", "<span style='font-weight:bold;'>$0</span>", $text );
    return $text;
}
$mes2_2 = changeX( $mojiretu2_2 );

こうするとか。(未テストです)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/02 13:40

    >kei344さん

    2パターンも考えてくださりどうもありがとうございました!
    どちらもコピペしてやらせていただいたのですが、どちらも最初に該当のものが出てくるところ(太字にするのがURLのコメントより先になってるのでそこで)で、こちらのエラーが出て、それ以降のコメントはまったく表示されない形となりました。

    Fatal error: Cannot redeclare h() (previously declared in C:\xampp\htdocs\waiwai\wg.php:228) in C:\xampp\htdocs\waiwai\wg.php on line 228

    この228行というのは、頭のfunction h( $str ) { return htmlspecialchars( $str, ENT_QUOTES, 'UTF-8' ); }
    この行になります。

    今回は、takasima20さんに教えていただいたコードでうまく出来たので問題解決しましたが、kei344さんが書いてくださったものはどちらもかなり短いのでビックリしました。ここまで簡潔に出来るものなんですね。ちょっと自分でも後でこれを調べてみたいと思います。

    大変勉強になりました。ありがとうございました!
    また何かありましたらどうぞよろしくお願いいたします!

    キャンセル

  • 2016/05/02 13:55 編集

    ああ、すいません h()を外したら問題ないと思います。(ちょっと修正しました)

    > ここまで簡潔に出来るものなんですね。
    preg_match_all はそれぞれ抜き出した項目に処理をかけたいときに使うので、置き換えるだけであれば preg_replace でいける気がします。(いろいろ書き方はあると思います)

    ひとまず解決お疲れ様です!

    キャンセル

  • 2016/05/02 14:35

    >kei344さん

    最後までどうもありがとうございました!ちゃんと出来ました!
    置き換えるだけなら~ というのはなるほどです!

    なんかせっかく書いていただいたのにこれをボツにするのももったいないので、
    今のとは別の掲示板で使わせていただきます(;^ω^)
    ほんとにどうもありがとうございました~!

    また何かありましたらよろしくお願いいたします|!

    キャンセル

checkベストアンサー

0

こんな感じ? 動かしてないんでミスってたらごめん。

if (!function_exists('change2')) {
  function change2($mojiretu2_2) { 
    preg_match_all("/(http|https):\/\/[-\w\.]+(:\d+)?(\/[^\s]*)?/", $mojiretu2_2, $pattarn2);
    $replace2 = array();
    foreach ($pattarn2[0] as $key2=>$val2) {
      $replace2[] = "<a href='" . $val2 . "' target='_blank' style='font-size:0.9em;'>" . $val2 . "</a>";
    }
    $tmp = str_replace($pattarn2[0], $replace2, $mojiretu2_2);

    $keyword_start = '>';
    $keyword_end = 'さん';
    preg_match_all("/" . preg_quote($keyword_start) . '.*' . preg_quote($keyword_end) . "/", $tmp, $match);
    $futoji = array();
    foreach ($match[0] as $key3=>$val3) {
      $futoji[] = "<span style='font-weight:bold;'>" . $val3 . "</span>";
    }
    $ret = str_replace($match[0], $futoji, $tmp);

    return $ret;
  }
}
$mes2_2 = change2($mojiretu2_2);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/01 19:04

    >takasima20さん

    早速にご回答くださりどうもありがとうございます!
    コピペさせていただいてやってみたのですが、URLの方も太字の方もどちらもきかない状態となります。

    なんかでもあと少しな感じもするので、書いていただいたことを元に、自分でもあれこれやってみようと思います。
    どうもありがとうございました。

    キャンセル

  • 2016/05/01 19:16

    あ、$retにセットするとこミスってた。
    修正しときました。
    (^_^;

    キャンセル

  • 2016/05/01 19:36

    >takasima20さん

    度々どうもありがとうございます!
    コピペさせていただいてやってみましたが、やはり文字の方は何も変化なく、またURLの方は、いくつか入ってるURLの一番最初のものだけが自動リンク付で表示されるのですが、それ以降のものはURLごと表示が消えてしまいます。
    お手数おかけしてすみません。

    キャンセル

  • 2016/05/01 21:29

    置換内容はみてなかったんで修正してみました。

    キャンセル

  • 2016/05/02 13:31

    >takasima20さん

    ありがとうございます!無事にうまく出来ました~~~!!!
    お忙しいところ、何度もほんとにすみませんでした。
    最後までめんどう見ていただき、またコピペするだけで良いように書いていただき、
    とっても感謝です! ほんとにどうもありがとうございました!

    また何かありましたらよろしくお願いいたします!

    キャンセル

0

elseがいらないんじゃない?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/02 13:34

    >te2jiさん

    ご回答をつけてくださりどうもありがとうございました!
    やってみたのですがやはりURLの方だけがきいてて、太字の方は変化なしでした。

    今回は、takasima20さんに教えていただいたやり方で無事にうまく出来ましたので良かったです。
    どうぞ、また何かありましたらよろしくお願いいたします!

    キャンセル

  • 2016/05/02 14:15

    条件式の正規表現もおかしかったんですね。
    "/" . preg_quote($keyword_start) . '.*' . preg_quote($keyword_end) . "/"
    に置き換えると動きます。
    ただ、同じ文字列2回が出現すると、多分意図する結果が得られなくなりそうですね。
    >さしすせそさん
    >さしすせそさん
    >さしすせそさん
    こんな文章だと、複数回置換が走ってしまう^^;

    キャンセル

  • 2016/05/02 14:20

    kei344 さんのだとうまくいくのでそちらを採用されたほうが良いかも

    キャンセル

  • 2016/05/02 16:27

    >te2jiさん

    追記のお返事をくださりどうもありがとうございます!
    書いてくださったこと、あとで試してみたいと思います。

    >ただ、同じ文字列2回が出現すると、多分意図する結果が得られなくなりそうですね
    そうなんですか?
    一応今回は、そういうパターンになることはまずないと思われる掲示板なので、今の形でとりあえずはいってみたいと思います。

    ほんとにどうもありがとうございました!
    またよろしくお願いいたします~!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20874questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。