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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Q&A

解決済

3回答

1740閲覧

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

mari.rinn

総合スコア296

PHP

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

0グッド

0クリップ

投稿2016/05/01 07:37

編集2016/05/01 07:42

他の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重書き込みみたいなことになってしまいました。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

PHP

1if ( !function_exists( 'h' ) ) { 2 function h( $str ) { return htmlspecialchars( $str, ENT_QUOTES, 'UTF-8' ); } 3} 4 5function change2( $text ){ 6 $pattern_url = "/(http|https):\/\/[-\w\.]+(:\d+)?(\/[^\s]*)?/"; 7 if( preg_match( $pattern_url, $text ) ) { 8 preg_match_all( $pattern_url, $text, $much_url ); 9 foreach ( $much_url[ 0 ] as $key => $val ){ 10 $replace1 = "<a href='".h( $val )."' target='_blank' style='font-size:0.9em;'>".h( $val )."</a>"; 11 $text = str_replace( $val, $replace1, $text ); 12 } 13 } 14 $pattern_name = "/>.*さん/"; 15 if ( preg_match( $pattern_name, $text ) ) { 16 preg_match_all( $pattern_name, $text, $much_name ); 17 foreach ( $much_name[ 0 ] as $key => $val ){ 18 $replace2 = "<span style='font-weight:bold;'>".h( $val )."</span>"; 19 $text = str_replace( $val, $replace2, $text ); 20 } 21 } 22 return $text; 23} 24$mes2_2 = change2( $mojiretu2_2 );

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

PHP

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

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

投稿2016/05/01 15:32

編集2016/05/02 05:20
kei344

総合スコア69400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mari.rinn

2016/05/02 04: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さんが書いてくださったものはどちらもかなり短いのでビックリしました。ここまで簡潔に出来るものなんですね。ちょっと自分でも後でこれを調べてみたいと思います。 大変勉強になりました。ありがとうございました! また何かありましたらどうぞよろしくお願いいたします!
kei344

2016/05/02 05:21 編集

ああ、すいません h()を外したら問題ないと思います。(ちょっと修正しました) > ここまで簡潔に出来るものなんですね。 preg_match_all はそれぞれ抜き出した項目に処理をかけたいときに使うので、置き換えるだけであれば preg_replace でいける気がします。(いろいろ書き方はあると思います) ひとまず解決お疲れ様です!
mari.rinn

2016/05/02 05:35

>kei344さん 最後までどうもありがとうございました!ちゃんと出来ました! 置き換えるだけなら~ というのはなるほどです! なんかせっかく書いていただいたのにこれをボツにするのももったいないので、 今のとは別の掲示板で使わせていただきます(;^ω^) ほんとにどうもありがとうございました~! また何かありましたらよろしくお願いいたします|!
guest

0

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

投稿2016/05/01 11:28

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mari.rinn

2016/05/02 04:34

>te2jiさん ご回答をつけてくださりどうもありがとうございました! やってみたのですがやはりURLの方だけがきいてて、太字の方は変化なしでした。 今回は、takasima20さんに教えていただいたやり方で無事にうまく出来ましたので良かったです。 どうぞ、また何かありましたらよろしくお願いいたします!
退会済みユーザー

退会済みユーザー

2016/05/02 05:15

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

退会済みユーザー

2016/05/02 05:20

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

2016/05/02 07:27

>te2jiさん 追記のお返事をくださりどうもありがとうございます! 書いてくださったこと、あとで試してみたいと思います。 >ただ、同じ文字列2回が出現すると、多分意図する結果が得られなくなりそうですね そうなんですか? 一応今回は、そういうパターンになることはまずないと思われる掲示板なので、今の形でとりあえずはいってみたいと思います。 ほんとにどうもありがとうございました! またよろしくお願いいたします~!
guest

0

ベストアンサー

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

PHP

1if (!function_exists('change2')) { 2 function change2($mojiretu2_2) { 3 preg_match_all("/(http|https):\/\/[-\w\.]+(:\d+)?(\/[^\s]*)?/", $mojiretu2_2, $pattarn2); 4 $replace2 = array(); 5 foreach ($pattarn2[0] as $key2=>$val2) { 6 $replace2[] = "<a href='" . $val2 . "' target='_blank' style='font-size:0.9em;'>" . $val2 . "</a>"; 7 } 8 $tmp = str_replace($pattarn2[0], $replace2, $mojiretu2_2); 9 10 $keyword_start = '>'; 11 $keyword_end = 'さん'; 12 preg_match_all("/" . preg_quote($keyword_start) . '.*' . preg_quote($keyword_end) . "/", $tmp, $match); 13 $futoji = array(); 14 foreach ($match[0] as $key3=>$val3) { 15 $futoji[] = "<span style='font-weight:bold;'>" . $val3 . "</span>"; 16 } 17 $ret = str_replace($match[0], $futoji, $tmp); 18 19 return $ret; 20 } 21} 22$mes2_2 = change2($mojiretu2_2);

投稿2016/05/01 09:13

編集2016/05/01 12:28
takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mari.rinn

2016/05/01 10:04

>takasima20さん 早速にご回答くださりどうもありがとうございます! コピペさせていただいてやってみたのですが、URLの方も太字の方もどちらもきかない状態となります。 なんかでもあと少しな感じもするので、書いていただいたことを元に、自分でもあれこれやってみようと思います。 どうもありがとうございました。
takasima20

2016/05/01 10:16

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

2016/05/01 10:36

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

2016/05/01 12:29

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

2016/05/02 04:31

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問