人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

php5.2.2の文字列置き換えの質問です。
data_array01に入っている文字列で、key_arrayの単語にマッチする部分に<strong>タグをつけたいのです。
http://q.hatena.ne.jp/1331075404
で質問したのですが、様々な問題が出てきて再度質問です。
data_array01の配列をdata_array02に置き換えたいのですがどう書けばいいですか?
mb_eregi_replaceあたりを使うとこまでは見当がつき、何度もトライしたのですがどのように使うのか解りません。


1)key_arrayはユーザーが入力するワードで、要素数と文字数は不確定です。
2)item_arrayには商品名が入っており、連想配列ですが簡略化しています。
3)英字の大文字と小文字は区別しない。
4)文字コードはutc-8。

key_array(
[0] => ア
[1] => o
)

data_array01(
[0] => ( [name] => アベラワー 18年 - ABERLOUR 18 years old)
[1] => ( [name] => アバフェルディー 12年 - ABERFELDY 12 years old)
[2] => ( [name] => ブレア・アソール - BLAIR ATHOL)
.....
)

item_array02(
[0] => ( [name] => <strong>ア</strong>ベラワー 18年 - ABERL<strong>O</strong>UR 18 years <strong>o</strong>ld)
[1] => ( [name] => <strong>ア</strong>バフェルディー 12年 - ABERFELDY 12 years <strong>o</strong>ld)
[2] => ( [name] => ブレ<strong>ア</strong>・<strong>ア</strong>ソール - BLAIR ATH<strong>O</strong>L)
.....
)

●質問者: seadwell
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● HowAreYou
●50ポイント
<?php

$key_array = array("", "o") ;
$data_array1 = array(
 array("name" => "アベラワー 18年 - ABERLOUR 18 years old)"),
 array("name" => "アバフェルディー 12年 - ABERFELDY 12 years old)"),
 array("name" => "ブレア・アソール - BLAIR ATHOL")
) ;

$data_array2 = array() ;

foreach ($data_array1 as $d) 
{
 $data_array2[] = preg_replace(
 "/(".join($key_array, "|").")/i",
 "<strong>$1</strong>", 
 $d["name"]
 ) ;
}

seadwellさんのコメント
あっさり希望どおりになりました。 正規表現がさっぱりなのです。 勉強に励みます。

2 ● oil999
●50ポイント ベストアンサー

コードがUTF-8であればpreg_replace関数の方が高速で、置換オプションも豊富なので、以下のようにしてみました。

<?php
$key_array = array(
 '0' => '',
 '1' => 'o'
);

$data_array01 = array(
 '0' => array('name' => 'アベラワー 18年 - ABERLOUR 18 years old'),
 '1' => array('name' => 'アバフェルディー 12年 - ABERFELDY 12 years old'),
 '2' => array('name' => 'ブレア・アソール - BLAIR ATHOL')
);

$data_array02 = array();

//置換パターン生成
$pat = '/(';
foreach ($key_array as $key=>$val) {
 if ($key != 0) $pat .= '|';
 $pat .= $val;
}
$pat .= ')/ui';
$rep = "<strong>$1</strong>";

//置換実行
foreach ($data_array01 as $key=>$item) {
 $data_array02[$key]['name'] = preg_replace($pat, $rep, $item['name']);
}

//結果の出力
print_r($data_array02);
?>

seadwellさんのコメント
こちらも問題なく動作しました。 > UTF-8であればpreg_replace関数の方が高速で、置換オプションも豊富 教えていただいてありがとうございます。 正規表現がユニークですね。勉強になります。 ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ