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)
.....
)
コードが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); ?>
<?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"] ) ; }
あっさり希望どおりになりました。
正規表現がさっぱりなのです。
勉強に励みます。
コードが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); ?>
こちらも問題なく動作しました。
> UTF-8であればpreg_replace関数の方が高速で、置換オプションも豊富
教えていただいてありがとうございます。
正規表現がユニークですね。勉強になります。
ありがとうございました。
こちらも問題なく動作しました。
2012/03/08 13:36:32> UTF-8であればpreg_replace関数の方が高速で、置換オプションも豊富
教えていただいてありがとうございます。
正規表現がユニークですね。勉強になります。
ありがとうございました。