重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

お世話になります。
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以外は効果ないので・・・。

A 回答 (4件)

書き忘れていました


for ($j = 0; $j < strlen($matches[0]); $j++)
{
のあとに
80文字で制限をかけるのなら
if ($j >= 80) { break; }
で 文字が80文字で切れると思います。
    • good
    • 0
この回答へのお礼

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:]\+\$\;\?\.%,!#~*/:@&=_-]+)'"
のように内側をシングルクォーテーションで括ったら直りました。

おかげで助かりました。
ありがとうございました!

お礼日時:2005/03/14 19:53

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);
    • good
    • 0

処理は遅くなりますが、


preg_split で一度分解して、
もう一度配列に対して、順に同じ表現で検索して
一致した行で、長さを測り 折り返して置き換えてはどうでしょうか?
    • good
    • 0

こんにちは、



この問題は、結構悩みますよね。
ワードブレイクがかからない文は、
mb_sTrimWidthなんかで強制的に丸めるとか、
場合により、「リンク」などの文字に置き換えて、
title="長いリンク先"という感じで細くしています。
丸める場合も、title入れておくと良いと思います。
全部に入れると、返って見にくくなりますが・・・
まぁ、ステータスバーを見たら解決するもんだいですが、変なリンク先の場合に困りますので・・・
いろいろと対策を考えて、わたくしも苦労しています。

ご存知かもしれませんが、ワードブレイクがかからないのは、リンクだけではないので、テーブルを乱される対処をする場合は、もう少し対策が必要です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
やっぱりどなたでも悩むんですね、この問題は。
一応解決できまして、#4さんへのお礼欄にコードを記載させていただきました。
ご参考までにどうぞ。

お礼日時:2005/03/14 19:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!