環境-----
CentOs 4.2
PHP 4.3.9
質問-----
あるテキストデータがあります。
そのデータには、適当な文字列と、中にhttp等から始まる、URLが含まれています。
このURLを自動リンクさせるためには、下記の様に、置換すればいいのですが、
$string = ereg_replace("(^|[^=\"'])(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","\\1<a href=\"\\2\\3\" target=\"_blank\">\\2\\3</a>",$string);
長いURLの場合、見栄えが悪いので、
http://www.example.com/example.php?column=sampledata123456....
と言うように、適当な文字数で丸めて、...と言うのを最後に付け足したいと考えています。
方法をご教授ください。
1つ目の回答へのコメントを読んで、意味が分かりました。
最初の回答では質問の意図を汲みきれておりませんでしたので、ソースを書き直しました。
一度試してみていただけますでしょうか。
<?php /* URL文字列を自動リンクする関数を作成 第1引数はURL文字列、第2引数は丸めない最大のURLの長さ */ function url_auto_link($input_string, $max_url_length) { /* 処理概要説明 1. preg_match_allでURLに相当する文字列を抽出し、変数$url_stringに代入 2. その文字列が$max_url_lengthより大きい場合、末尾に"..."を付与し、丸め、$url_short_stringに代入 その文字列が$max_url_length以下の場合、$url_stringの内容をそのまま$url_short_stringに代入 3. str_replaceで$url_stringをリンクに置換 4. 置換後の文字列をprintで出力 */ preg_match_all("/(^|[^=\"'])(https?|ftp|news)(:\/\/[[:alnum:]+$;?.%,!#~*\/:@&=_-]+)/",$input_string,$out,PREG_SET_ORDER); for ($i=0;$i<count($out);$i++){ $url_string = $out[$i][2] . $out[$i][3]; if (strlen($url_string) > $max_url_length){ $url_short_string = substr($url_string,0,$max_url_length) . '...'; } else { $url_short_string = $url_string; } $input_string = str_replace($url_string,"<a href=\"$url_string\" target=\"_blank\">$url_short_string</a>",$input_string); } print $input_string; } // サンプルの文字列 $str1 = "テストhttp://hoge.com/hogehogehogehogehogehogehogehoge/テスト"; $str2 = "改行を含む場合のテストです。 ソース内では改行されます。 http://hoge.com/ "; $str3 = "複数のURLが存在する場合のテストです。 http://aaa.hoge.com/hogehogehogehogehogehogehoge/ http://bbb.hoge.com/hogehogehogehogehogehogehoge/ http://ccc.hoge.com/hogehogehogehogehogehogehoge/ "; $str4 = "通常の文字列です。<br />改行はHTMLのBRタグで行っています。"; // 出力テスト url_auto_link($str1,40); print "<br />"; url_auto_link($str2,40); print "<br />"; url_auto_link($str3,40); print "<br />"; url_auto_link($str4,40); ?>
参考になれば幸いです。
質問をよく読んでください。
URL置換かつ、URLのみ丸めたいのです。
例えば、
>長いURLの場合、見栄えが悪いので、
>http://www.example.com/example.php?column=sampledata12345678...
>と言うように、適当な文字数で丸めて、...と言うのを最後に付け足したいと考えています。
という文字列の場合、
>長いURLの場合、見栄えが悪いので、
>http://www.example.com/example.php?column=sampledata123456.....
>と言うように、適当な文字数で丸めて、...と言うのを最後に付け足したいと考えています。
という感じにしたいのです。
思いつきで書いてしまったので、よく見直せばもう少しシンプルにかける部分があるような気がしますが、参考にしてみてください。
url_auto_linkという関数を定義してみました。
$url_string_shortという変数に短くカットした文字列を入れ、それを表示用の文字として使っています。
<?php /* URL文字列を自動リンクする関数を作成 第1引数はURL文字列、第2引数は丸めない最大のURLの長さ */ function url_auto_link($url_string, $max_url_length) { if (strlen($url_string) > $max_url_length) { $url_string_short = substr($url_string,0,$max_url_length) . '...'; } else { $url_string_short = $url_string; } $auto_link = ereg_replace("(^|[^=\"'])(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","\\1<a href=\"\\2\\3\" target=\"_blank\">$url_string_short</a>",$url_string); print $auto_link; } // サンプルの文字列 $str1 = "http://hoge.com/hogehogehogehogehogehogehogehoge/"; $str2 = "http://hoge.com/"; // 出力テスト url_auto_link($str1,30); print "<br />"; url_auto_link($str2,30); ?>
参考になれば幸いです。
ありがとうございます。
かなり近いのですが、文字列に複数のURLが含まれていると、表示の部分のみ1つ目のURLに置き換えられてしまいます。
1つ目の回答へのコメントを読んで、意味が分かりました。
最初の回答では質問の意図を汲みきれておりませんでしたので、ソースを書き直しました。
一度試してみていただけますでしょうか。
<?php /* URL文字列を自動リンクする関数を作成 第1引数はURL文字列、第2引数は丸めない最大のURLの長さ */ function url_auto_link($input_string, $max_url_length) { /* 処理概要説明 1. preg_match_allでURLに相当する文字列を抽出し、変数$url_stringに代入 2. その文字列が$max_url_lengthより大きい場合、末尾に"..."を付与し、丸め、$url_short_stringに代入 その文字列が$max_url_length以下の場合、$url_stringの内容をそのまま$url_short_stringに代入 3. str_replaceで$url_stringをリンクに置換 4. 置換後の文字列をprintで出力 */ preg_match_all("/(^|[^=\"'])(https?|ftp|news)(:\/\/[[:alnum:]+$;?.%,!#~*\/:@&=_-]+)/",$input_string,$out,PREG_SET_ORDER); for ($i=0;$i<count($out);$i++){ $url_string = $out[$i][2] . $out[$i][3]; if (strlen($url_string) > $max_url_length){ $url_short_string = substr($url_string,0,$max_url_length) . '...'; } else { $url_short_string = $url_string; } $input_string = str_replace($url_string,"<a href=\"$url_string\" target=\"_blank\">$url_short_string</a>",$input_string); } print $input_string; } // サンプルの文字列 $str1 = "テストhttp://hoge.com/hogehogehogehogehogehogehogehoge/テスト"; $str2 = "改行を含む場合のテストです。 ソース内では改行されます。 http://hoge.com/ "; $str3 = "複数のURLが存在する場合のテストです。 http://aaa.hoge.com/hogehogehogehogehogehogehoge/ http://bbb.hoge.com/hogehogehogehogehogehogehoge/ http://ccc.hoge.com/hogehogehogehogehogehogehoge/ "; $str4 = "通常の文字列です。<br />改行はHTMLのBRタグで行っています。"; // 出力テスト url_auto_link($str1,40); print "<br />"; url_auto_link($str2,40); print "<br />"; url_auto_link($str3,40); print "<br />"; url_auto_link($str4,40); ?>
参考になれば幸いです。
ありがとうございます。
まさにビンゴです!!!
大感謝。
文字加工の関数を駆使すればやろうとしてることは出来ると
思います。
正規表現で一旦URLリンク化し、文字列関数でURLリンク部分を抜き取ります。
必要な文字列を分解します。
リンク文字部分を「substr」を使用し文字数制限をつけて
加工すれば、道のりは長いですが加工できます。
http://www.gihyo.co.jp/books/syoseki.php/4-7741-1668-8
こちらの本は小さいですが、かゆいところに手が届く内容で
非常に分かり易かったです。
まずpreg_matchでURL部分を抽出します。
# 最初の(^|[^=\"'])が何のためなのか分からないので省きます。
preg_match('/(https?|ftp|news)(:\/\/[^\s]+)/', $string, $matches);
$url = $matches[1] . $matches[2];
$string = preg_replace('/(https?|ftp|news)(:\/\/[^\s]{丸める文字数})/', "<a href=\"{$url}\" target=\"_blank\">\\1\\2...</a>", $string)
これで丸められた文字列がリンクされます。
丸めたらtitle属性で全体のURLを表示させた方が、ユーザーも安心だと思います。
1行でやろうとするとpreg_replaceの中にpreg_replaceを入れる形になると思いますので、可読性重視でmatchとreplaceに分けました。
ありがとうございます。
まさにビンゴです!!!
大感謝。