- ベストアンサー
正規表現で自動リンク後、長いURL表示を丸めたい
お世話になります。 PHP4で作った掲示板を運営しています。 過去ログを参考にし、以下の正規表現で投稿本文中のURLを自動リンクしています。 $text=ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","<a href='\\0'>\\0</a>",$text); 今の問題は、長いURLを貼られたときに折り返しされず掲示板のレイアウトが崩れることです。 そこで<a>~</a>間の表示部分だけ規定文字数で丸めたいのですが、なかなか良い方法が思いつきません。 どなたかお知恵を貸してください。 ちなみに応急処置として、親<td>タグに style="word-break:break-all;" を入れています。 でもこれだとIE以外は効果ないので・・・。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
書き忘れていました for ($j = 0; $j < strlen($matches[0]); $j++) { のあとに 80文字で制限をかけるのなら if ($j >= 80) { break; } で 文字が80文字で切れると思います。
その他の回答 (3)
PHP始めたばかりで 正規表現の使い方知らないので 自分でフィルター部分は書き換えてください。 下記で 折り返しできます。 // the callback function function MakeURLLink($matches) { // as usual: $matches[0] is the complete match // $matches[1] the match for the first subpattern // enclosed in '(...)' and so on $TempURLText = ""; for ($j = 0; $j < strlen($matches[0]); $j++) { if ($j ==0) { $TempURLText = $matches[0][0]; } else { if ($j % 3 !=0) // ここに折り返す数字を入れる { $TempURLText .= $matches[0][$j]; } else { $TempURLText = $TempURLText."<br>".$matches[0][$j]; } } } return "<a href=".$matches[0].">".$TempURLText."</a>"; } $URLFilter ="|http|"; echo preg_replace_callback( $URLFilter , "MakeURLLink", $URL0);
処理は遅くなりますが、 preg_split で一度分解して、 もう一度配列に対して、順に同じ表現で検索して 一致した行で、長さを測り 折り返して置き換えてはどうでしょうか?
- kotaron
- ベストアンサー率61% (8/13)
こんにちは、 この問題は、結構悩みますよね。 ワードブレイクがかからない文は、 mb_sTrimWidthなんかで強制的に丸めるとか、 場合により、「リンク」などの文字に置き換えて、 title="長いリンク先"という感じで細くしています。 丸める場合も、title入れておくと良いと思います。 全部に入れると、返って見にくくなりますが・・・ まぁ、ステータスバーを見たら解決するもんだいですが、変なリンク先の場合に困りますので・・・ いろいろと対策を考えて、わたくしも苦労しています。 ご存知かもしれませんが、ワードブレイクがかからないのは、リンクだけではないので、テーブルを乱される対処をする場合は、もう少し対策が必要です。
お礼
回答ありがとうございます。 やっぱりどなたでも悩むんですね、この問題は。 一応解決できまして、#4さんへのお礼欄にコードを記載させていただきました。 ご参考までにどうぞ。
お礼
preg_replace_callback()という関数があったんですね! 手元のリファレンスに載ってなかったので、正規表現でマッチした文字列を個別に抜き出す方法がわからなかったんですよ。 でもこれで解決しました。 教えていただいたコードを元に、こんな感じでやりたかったことを実現しました。 //----------------------------------------- function MakeURLLink($matches) { $TempURLText = $matches[0]; $maxlen = 30;//丸める文字数 if (strlen($matches[0]) > $maxlen){ $TempURLText = substr($matches[0], 0, $maxlen)."...";//$maxlenで文字列を切って「...」をつける } return "<a href=".$matches[0].">".$TempURLText."</a>"; } $URLFilter ="'(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)'"; echo preg_replace_callback($URLFilter, "MakeURLLink", $text); //----------------------------------------- ereg_replaceで使っていた正規表現をそのまま使うとエラーが出てしまいかなり悩んだんですが、 "(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)" ↓ "'(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)'" のように内側をシングルクォーテーションで括ったら直りました。 おかげで助かりました。 ありがとうございました!