dポイントプレゼントキャンペーン実施中!

preg_replcace_callback を使用して、<a>タグ内のURLの字数を制御するコードに取り組んでいます。詳しい方アドバイスしてくださると助かります。

下のコードの、shorten(カスタム関数)に渡されるデータが配列なのですが、並列に並んだ配列のようなのです。echo をかけてみると、ArrayArray と表示されます。しかし、Array([0]=>Array [1]=>Array) ではないので、どうやって 処理をかけて return すればよいのか途方にくれています。

もしよい方法をご存知の方おられましたらどうぞよろしくお願いいたします。

<?
$str = <<<HERE
//長いURLのサンプルです。ここの掲示板の処理で途中で表示がカットされていますが、<a href="http://長いURL">http://長いURL</a>という構成になっています。
<a href="http://gooooooooooooooooooooooooooooooooooogle.c …[</a>
<a href="http://yahooooooooooooooooooooooooooooooooooo.co …
HERE;

$pattern = "#<a(.*?)>(.*?)<\/a>#s";
$str = preg_replace_callback($pattern, 'shorten', $str);
echo $str;

function shorten($matches) {
foreach($matches as $index => $match) {
if (strlen($match) > 20) {
$matches[$index] = substr($match, 0, 20) . '....';
}
}
return $matches;
}
?>

A 回答 (1件)

>echo をかけてみると、ArrayArray と表示されます。



function shorten($matches) {
var_dump($matches); // 変数のダンプをする
・・・

とすると、shorten関数に渡ってきたデータの構造がわかります。
このデータは配列で、$matches[0]はパターン全体にマッチした文字列、$matches[1]はパターン内の1番目の()にマッチした文字列、$matches[2]はパターン内の2番目の()にマッチした文字列、、、となります。

returnするのは文字列です。returnした文字列によって、パターン全体にマッチした部分が置き換わります。この例で、「hogehoge」をリターンすると、「<a href="url">url</a>」が「hogehoge」に置き換えられます。

PHPマニュアルに、もっと詳しい説明や例が載っています。
http://www.php.net/manual/ja/function.preg-repla …
    • good
    • 0
この回答へのお礼

ありがとうございます。マニュアルは一通り目を通しました。しかし、マッチが格納されている変数が複数の配列を含んでいるケースは見当たらなかったのですがこちらの見落としでしょうか?

print_r($matches)を関数内で行った結果、
Array
(
[0] => <a href="URL1">URL1</a>
[1] => href="URL1"
[2] => URL1
)
Array
(
[0] => <a href="URL2">URL2</a>
[1] => href="URL2"
[2] => URL2
)
とでました。URL1、2はそれぞれ違うhttp://形式のURLです。
これをどのようにして返せばよいのでしょうか?

$pattern = "#<a(.*?)>(.*?)<\/a>#s";
$str = preg_replace_callback($pattern, 'shorten', $str);
echo $str;

function shorten($matches) {
if (strlen($matches[2]) > 20) {
$matches[2] = substr($matches[2], 0, 20) . '....';
}
return $matches;
}

としても、ArrayArray と表示されます。

お礼日時:2006/12/14 22:33

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