• ベストアンサー
  • 困ってます

正規表現で自動リンク後、長い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
  • 閲覧数192
  • ありがとう数3

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

  • ベストアンサー
  • 回答No.4
noname#9903
noname#9903

書き忘れていました for ($j = 0; $j < strlen($matches[0]); $j++) { のあとに 80文字で制限をかけるのなら if ($j >= 80) { break; } で 文字が80文字で切れると思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • 正規表現について

    すみませんが、教えてください。 PHP+MYSQLで掲示板のようなサイトを作っています。 投稿したコメントの中にURLがある場合、次の変換で、リンクを設定するようにしています。 $str = ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)", "<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>", $aStr); さらに、次のことがしたいのですが、どうすれば良いのか教えてください。 (1)URLが長い場合、表示する文字列を指定文字数でカットする。 (2)URLのみをリンク設定付で切り出す。 当方、正規表現がほとんど理解できていません。 (オイラリーの本を買ったのですが、時間がなくて学習できていません。) 申し訳ございませんが、こうすれば良いというコードを教えていただければ、幸いです。

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

    お世話になります。 ereg_replace で書いた正規表現による置換処理を、 preg_replace に置き換えようとしています。 (preg_replaceの方が処理が速いとマニュアルにあったので) ところが、preg_replaceでの正規表現検索がうまくいかないで困っています。 基本的には、ereg_replaceの正規表現部分を//で囲んでいるだけです。 具体的には、下記のような処理を書いています。 間違いがあれば、ご指摘いただけましたら幸いです。 //### うまくいっている ereg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='\{dokuji tag\}.+\{_dokuji tag\}'; $replace=''; $html=ereg_replace($search,$replace,$html); //不要部分の削除 //### うまくいっている ereg_replace のパターン ここまで ### ↓ //### うまくいかない preg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='/\{dokuji tag\}.+\{_dokuji tag\}/m'; $replace=''; $html=preg_replace($search,$replace,$html); //不要部分の削除 //### うまくいかない preg_replace のパターン ここまで ### //### 置き換えるソース('template/temple.html') ここから ### <!-- {dokuji tag} --> <tr> <td nowrap><strong>タイトル:</strong></td> <td> <input type="text" name="name" size="80" value="{name}" /> </td> </tr> <!-- {_dokuji tag} --> //### 置き換えるソース('template/temple.html') ここまで ### よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • コメントタグに挟まれた部分を正規表現で検索したい。

    正規表現初心者です。 $html=' ~略~ <!--{loop|news}--> <li>{news|month}月{news|day}日 ・ {news|text} </li> <!--{/loop|news}--> ~略~ '; といった文字列から、 <!--{loop|○○}-->~<!--{/loop|○○}--> というパターンの部分を検索したいのですが、どのように書けばよいのでしょうか? ereg("<!--{loop\|([[:alnum:]_]+)}-->()<!--{/loop\|([[:alnum:]_]+)}-->",$html, $matches); などと書いてみたのですが、真ん中あたりにある、「()」のところをどうかけば良いのかが分かりません。(日本語が混じっているので、どのように書いてよいのか分かりません。) ご教授お願いいたします。

    • ベストアンサー
    • PHP

その他の回答 (3)

  • 回答No.3
noname#9903
noname#9903

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);

共感・感謝の気持ちを伝えよう!

  • 回答No.2
noname#9903
noname#9903

処理は遅くなりますが、 preg_split で一度分解して、 もう一度配列に対して、順に同じ表現で検索して 一致した行で、長さを測り 折り返して置き換えてはどうでしょうか?

共感・感謝の気持ちを伝えよう!

  • 回答No.1

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • VBで正規表現

    VBで正規表現 下記のような文字列がTextBoxに入力されています。 <a></a>で囲まれた部分の抽出は出来ましたが、 <td></td>タグで囲まれた’18’も取り出したいのですが正規表現ではどの様に記述すれば宜しいでしょうか? 関係有りそうなコードはこれです。 Regex("<a href=""(?<url>.*?)"".*?>(?<text>.*?)</a>" ---------------------------------------- <TR bgcolor=#ffffff> <TD> 18 </TD> <TD><a href="main.py?qtype=userpage&teamnum=162&username=KOTOKO"> KOTOKO </a> </TD> <TD><a href="http://fah-web2.stanford.edu/awards/cert.php?u=KOTOKO&pts=11379753" target="_blank"> 11379753 </a> </TD> <TD><a href="http://fah-web2.stanford.edu/awards/cert.php?u=KOTOKO&pts=16190&t=wus&bg=3" target="_blank"> 16190 </a> </TD> </TR> ----------------------------------------

  • 正規表現を用いてHTML内の文字列を抜き出したいのですが・・・

    PHPの正規表現を用いて外部Webページのソース内にある文字列を抜き出してきたいのですがうまくいきません。 例えば、 <td class="nml">食べてきれいにやせる! 伊達式脂肪燃焼ダイエット / 伊達友美<br></td> のようなタグに挟まれた文字列を抜き出します。自分で書いたプログラムは以下の通りです。 <?php //外部URL $fp = fopen("特定のURL", "r"); while(!feof($fp)){ //HTMLソースを全文取得 $line = fgets($fp, 1024); //各行を配列に格納 $line_array[] = $line; } //配列を一つの文字列に変換 $line_text = implode("", $line_array); if(preg_match_all('ここの部分が思いつきません', $line_text, $match)){ print $match; }else{ print 'マッチしません'; } ?> 色々と調べて試行錯誤しましたが、結局うまくいきませんでした。 正規表現となる部分をどなたかご教授頂けないでしょうか。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • mysqlの関数でereg_replace

    レコードから、特定のドメインを含むURLを消去する、といった動作をmysqlの関数で実現しようと考えてます。phpで言うところのereg_replace()のような関数がmysqlであるかどうかということです。 以下のように"bbs"というテーブルの"com"というフィールドからURLに値する文字列を消去するSQL分を実行しましたがこれは動作しませんでした。 update bbs set com = replace(com,regexp '(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)','') where com regexp '(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)'; replace関数の第二引数にregexpを使用することができませんでした。(やり方が間違ってるのでしょうか?) phpのereg_replaceを使用してフィールド"com"に含まれるURLを消去していくというやり方で実現は可能なのですが、動作の軽さやソースのシンプルさを考え、SQL文で実現することを考えてます。 mysqlのヴァージョンは3.23.58です。 よろしくお願いいたします。m(__)m

  • 正規表現文字列をDB登録

    正規表現に詳しくないことと、PHPも携わったばかりなので、苦戦しています。ご教授いただけると助かります。 以下のようなことをやろうとしています。 1.フォームで入力された正規表現を文字列としてDBに登録していきます。 例{http://[w-.]*test_site.jp}i 2.登録データを取り出して、preg_replace()を使いたいです $url_text = {http://[\w\-.]*test_site\.jp}i $db_data ←1のデータ(配列になってます) preg_replace($db_data, '', $url_text, -1) そうすると、$db_dataの中身は\がないために、エラーとなります。 Warning: preg_replace(): Compilation failed: range out of order in character class at offset 10 DBから取得した後に、変換するような関数などあるんでしょうか。 それとも他の方法を探したほうがよいのでしょうか。 一致したものを省きたいような処理なのですが・・・。 ためしにpreg_quote()をかけてみましたが変な風に置換されてダメでした。 うまく説明もできなくて申し訳ないですが、何か良い案ありますでしょうか。 必要であれば、補足いたします。 ぜひお願いいたします。

    • ベストアンサー
    • PHP
  • PHP5.3以降のereg_replaceについて

    PHP5.3以降にアップデートしたところ、ereg_replaceで書かれている箇所で警告が出るようになりました。 マニュアルを見た限りではpreg_replaceへの移行が推奨されているようなので、preg_replaceに書き換えようと思い、http://melma.com/backnumber_129036_1571788/を参考に、2つ目のパラメータの前後に/を付けましたが、画面に何も表示されず、どのように記述すれば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 なお、ソースは下記となります。 また、記述はhttp://okwave.jp/qa/q849820.html?&status=true&errcode=&msg=&qid=849820を使用させていただいており、やりたいことはURLに自動的にハイパーリンクを付加したいという状況で、ereg_replaceを使用すればできております。 <?php $proto = "私のブログはhttp://www.hoge.com/です。"; $proto = ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>",$proto); //$proto = preg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","/<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>/",$proto); print $proto; ?> 以上、宜しくお願いします。

    • ベストアンサー
    • PHP
  • 正規表現の部分が解読できません

    twitterをHPに読み込んでいるのですが ツイートでリンクを張ったさいに下記のような現象がおきます。 【ツイート内容】 詳細はhttp://ooo.ooo.comを見てください           ↑url部分にリンク 【HPに読み込まれた内容】 詳細はhttp://ooo.ooo.comを見てください           ↑<http://ooo.ooo.comを見てください>の部分にリンクが張られ            飛び先のURLも<http://ooo.ooo.comを見てください>となってしまう。 使用しているjsファイルは以下になります。(blogger.js) function twitterCallback2(twitters) { var statusHTML = []; for (var i=0; i<twitters.length; i++){ var username = twitters[i].user.screen_name; var status = twitters[i].text.replace(/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) { return '<a href="'+url+'">'+url+'</a>'; }).replace(/\B@([_a-z0-9]+)/ig, function(reply) { return reply.charAt(0)+'<a href="http://twitter.com/'+reply.substring(1)+'">'+reply.substring(1)+'</a>'; }); statusHTML.push('<li><span>'+status+'</span> <a style="font-size:85%" href="http://twitter.com/'+username+'/statuses/'+twitters[i].id_str+'">'+relative_time(twitters[i].created_at)+'</a></li>'); } document.getElementById('twitter_update_list').innerHTML = statusHTML.join(''); } おそらく正規表現の部分が原因なのはわかるのですが どこを同いじったらいいかがわからず困っております。 アドバイスなどいただけましたら幸いです。 よろしくお願いいたします。

  • PHP正規表現の特定文字列を省く場合

    PHPを仕事で少し使用しております、Webデザイナーです。知識が少なく、正規表現での疑問がどうしても解決出来ずに困っております。限界を感じ質問させていただきました。どうぞよろしくお願いいたします。 PHPでURLにリンクを設定しております。文字列の中の「http」などで始まるURLにリンクを付けることは問題ないのですが、その中で「[nolink]http」といった特定の文字列が頭についているURLのみリンクを付けないようにしたいと考えております。ソースは以下の通りですが、上手くいきません。?!の個所を色々変えてみましたが、正しく認識されないorエラーが出てしまいます。 $body = preg_replace("/((?!\[nolink\])(https?|ftp)(:\/\/[A-Za-z0-9\+\$\;\?\.%,!#~\*\/:@&=_\-]+)/", "<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>", $body); そもそもの考え方が間違っているのか、中途半端な知識のため解決の糸口がつかめません。どうぞご教授頂けますようお願いいたします。

    • 締切済み
    • PHP
  • 自動リンクの作り方を探しています

    Perlによる自作掲示板の作成中です。 URLの自動リンク機能を作りたいのですが、いろいろな単語を入れ替えて検索してもレンタル掲示板のサイトばかりでレクチャーしているページを見つけられません。 Perl自体の本も読んでいますし少しなら知識もあります。正規表現を使うのだろうということくらいはわかるのですが… 回答で解説していただくのももちろん嬉しいのですが、今後のためにはサイトを紹介していただけるとなおありがたいです。ちなみに現在勉強のために見ているサイトには求める記述はありません。 提示の不足があったらすみませんが、お暇な方でかまわないのでお願いします。

    • 締切済み
    • CGI
  • textarea内のタグを反映させたいのですが

    http://okweb.jp/kotaeru.php3?q=984300を参考に 改行を犠牲にして自動リンクを利用できるようにしたのですが、 HTMLの一部に編集内容を反映したいため FONTタグ等も利用したいんです。 何か良い方法はありませんでしょうか? よろしくお願いします。 <?PHP 文字制限のため省略ですが参考元と同様です。 ?> <html> <title>テキストファイルのデータ更新</title> </head> <body> <form method="post" action="edit.php"> data1の変更 - <textarea name ="data1" rows="5" cols="40"><?php echo preg_replace("/<br>/", "\n", $ini['data1']); ?></textarea><br> data2の変更 - <textarea name ="data2" rows="5" cols="40"><?php echo preg_replace("/<br>/", "\n", $ini['data2']); ?></textarea><br> data3の変更 - <textarea name ="data3" rows="5" cols="40"><?php echo preg_replace("/<br>/", "\n", $ini['data3']); ?></textarea><br> <input type="submit" value="送信"> </form> <table> <tr><td>data1</td><td><?PHP echo ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\">\\0</a>", $ini['data1']); ?></td></tr> <tr><td>data2</td><td><?PHP echo ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\">\\0</a>", $ini['data2']); ?></td></tr> <tr><td>data3</td><td><?PHP echo ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\">\\0</a>", $ini['data3']); ?></td></tr> </table> </body> </html>

    • 締切済み
    • PHP
  • 正規表現で全角文字を全て削除したい

    正規表現を使ってアスキーコード文字以外の全角文字を全て削除しようとしたのですが、ユーロ記号 € が削除できませんでした。 以下は英小文字以外全て削除しようとしたものです。 英小文字以外や全角文字は削除できているようですが、ユーロ記号が削除されません。 mb_ereg_replace ('[^a-z]', "", $str); error_logを使って確認してみるとそもそもブラウザから送られてきたきた時点で &#8364; となっています。(ユーロ記号そのものがこの場に表示されてしまうので全角で明記していますが実際は7文字全て半角です。) これが正しい挙動なのかどうかも判断がつきかねています。(コード番号そのものはユーロ記号のようですが) error_log($_POST['moji'], 0); 以下のようにアスキーコード以外全て削除という指定も削除されませんでした。 &#8364; をアスキーコード7文字として一つ一つ処理しているようです。 mb_ereg_replace ('[^\x00-\x7f]', "", $str); ちなみにこの &#8364; の入った $str をHTMLを使いブラウザに出力してやるとちゃんとユーロ記号が表示されます。 <pre>{$str}</pre> mb_internal_encodingやmb_regex_encodingの設定などいろいろ試してみたのですがうまくいきませんでした。 この文章を書いていて今思ったのですが、ひょっとしてまず &#と; で挟まれたものを削除するというのがこの問題の一般的な解決方法なのでしょうか。そうすればユーロ記号 &#8364; も削除できますし。もしそうならその辺の事情も解説あるいはURL明記していただけると助かります。 (でもこれ、アスキーコードは残したい場合にたまたま &#8364; というユーロ記号を意図しないただの半角7文字の文が入力されてきてしまっても削除されるということになっちゃいますね。これはやっぱりしょうがないのですかね。) よろしくお願いします。

    • ベストアンサー
    • PHP