【PHP】


環境-----
 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人2回まで
  • 登録:
  • 終了:2006/05/11 15:22:55
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:bonlife No.3

回答回数421ベストアンサー獲得回数75

ポイント100pt

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

参考になれば幸いです。

id:keijiro

ありがとうございます。

まさにビンゴです!!!

大感謝。

2006/05/11 15:21:34

その他の回答4件)

id:tamo2_xvi No.1

回答回数436ベストアンサー獲得回数10

ポイント1pt

http://jp2.php.net/manual/ja/function.substr.php

文字列関数「substr」を利用してURLの文字列を加工すれば

出来ると思います。

id:keijiro

質問をよく読んでください。

URL置換かつ、URLのみ丸めたいのです。

例えば、

>長いURLの場合、見栄えが悪いので、

>http://www.example.com/example.php?column=sampledata12345678...

>と言うように、適当な文字数で丸めて、...と言うのを最後に付け足したいと考えています。

という文字列の場合、

>長いURLの場合、見栄えが悪いので、

>http://www.example.com/example.php?column=sampledata123456.....

>と言うように、適当な文字数で丸めて、...と言うのを最後に付け足したいと考えています。

という感じにしたいのです。

2006/05/11 01:28:36
id:bonlife No.2

回答回数421ベストアンサー獲得回数75

ポイント8pt

思いつきで書いてしまったので、よく見直せばもう少しシンプルにかける部分があるような気がしますが、参考にしてみてください。

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

参考になれば幸いです。

id:keijiro

ありがとうございます。

かなり近いのですが、文字列に複数のURLが含まれていると、表示の部分のみ1つ目のURLに置き換えられてしまいます。

2006/05/11 15:20:20
id:bonlife No.3

回答回数421ベストアンサー獲得回数75ここでベストアンサー

ポイント100pt

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

参考になれば幸いです。

id:keijiro

ありがとうございます。

まさにビンゴです!!!

大感謝。

2006/05/11 15:21:34
id:tamo2_xvi No.4

回答回数436ベストアンサー獲得回数10

ポイント10pt

文字加工の関数を駆使すればやろうとしてることは出来ると

思います。

正規表現で一旦URLリンク化し、文字列関数でURLリンク部分を抜き取ります。

必要な文字列を分解します。

リンク文字部分を「substr」を使用し文字数制限をつけて

加工すれば、道のりは長いですが加工できます。

http://www.gihyo.co.jp/books/syoseki.php/4-7741-1668-8

こちらの本は小さいですが、かゆいところに手が届く内容で

非常に分かり易かったです。

id:vector_xenon No.5

回答回数113ベストアンサー獲得回数4

ポイント10pt

まず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に分けました。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません