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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/03/08 13:37:16
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:oil999 No.2

回答回数1728ベストアンサー獲得回数320

ポイント50pt

コードが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);
?>
id:seadwell

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

2012/03/08 13:36:32

その他の回答1件)

id:HowAreYou No.1

回答回数91ベストアンサー獲得回数17

ポイント50pt
<?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"]
  ) ;
}
id:seadwell

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

2012/03/08 13:22:16
id:oil999 No.2

回答回数1728ベストアンサー獲得回数320ここでベストアンサー

ポイント50pt

コードが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);
?>
id:seadwell

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

2012/03/08 13:36:32

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

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

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

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

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