- 締切済み
strtrの場合の大文字小文字区別なしについて
キーワード$keyを含む文章を検索して表示する際に $keyを<span class"hoge">$key</span> に置き換えることによって、 表示する文章の中でキーワードの部分だけ、 文字色などを変えるという内容のプログラムです。 キーワードが複数存在する場合、 (キーワードがtestとtの場合など) 置き換えが重複するとタグが崩れてしまうので、 str_ireplaceではなく、strtrを使っています。 strtrは大文字小文字を区別してしまうようなのですが、 こちらを区別せずに使用する方法はありませんでしょうか? ちなみに該当部分のスクリプトは下記の通りです。 for($i = 0; $i < count($key); $i++){ $line = "<span class=\"hoge\">{$key[$i]}</span>"; $keychange["{$key[$i]}"] = $line; } $text = strtr($text, $keychange); //$keyがキーワードで$textが表示する文章です。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- kamikami30
- ベストアンサー率24% (812/3335)
どういった仕様の文章いくつから、 どういったいくつのキーワードを 検索してそれぞれで違う色などに変えたいのか 複数のキーワードなら一括して同じ色などにかえたいのか 最低これを埋めると、何したいのか伝わります。 1つの文字列の、範囲から、1つの文字列を検索して、ヒットした文字列を強調表示はできるんですよね? 該当箇所というのは質問のどの部分に該当しているの? 質問内容には該当していないと思いますけど。 置き換える処理はしてないし。 置き換えしたい処理を実際にメモ帳等でやったら何すればいいか少しは見えてくるかと思います。
お礼
さらに置き換え処理の部分だけを取り上げた説明です。 例えば下記のような文章があったとします。 ---これはappleでaです。 この場合のappleとaだけを強調表示したい場合です。 $text = "これはappleでaです。"; $key = array("apple", "a"); for($i = 0; $i < $count($key); $i++){ $line = "<span class=\"hoge\">{$key[$i]}</span>"; $keychg["{$key[$i]}"] = $line; } この後に、str_ireplaceで置き換え処理した場合、 $text = str_ireplace(array_keys($keychg), array_values($keychg) ,$text); この場合ですと、appleのaやspanのa、classのaにまで置き換え処理が及びます。 そこでstrtrを使用した場合、 $text = strtr($text, $keychg); この場合には問題なく、置き換え処理が完了します。 ところが $key = array("APPLE", "A"); $key = array("Apple", "A"); の場合ですと、strtrでは一致しなくなってしまいます。 このような問題になります。
補足
説明ベタ、説明不足にて申し訳ありません。 まず文章ですがタグ等一切含まれていない 単純なテキストデータが多数(数百件)です。 キーワードは数字・文字列あらゆるものを受け付けます。 また文字数も1文字から何文字でも受け付けます。 検索して、検索(AND検索)に一致した複数の文章を表示し、 その全ての文章内のキーワードと一致する箇所のみに、 青文字+太字+文字サイズ大きめのstyleをSPANタグで付加します。 複数のキーワードを指定した場合は、 もちろん全ての文章の全てのキーワードの箇所にSPANタグを付加します。 > 1つの文字列の、範囲から、1つの文字列を検索して、 > ヒットした文字列を強調表示はできるんですよね? これはできています。 またキーワードが複数であっても キーワード同士が全く異なる場合にも問題なくできています。 問題があるのは、検索して出てきた文章に、 置き換え処理でタグを付加する部分で、 キーワード同士が被る場合です。 例えば、appleというキーワードで検索して、 下記の2文章がヒットしたとします。 ---これはappleです。 ---これはappleではありません。 この場合はappleが問題なく、強調表示できます。 結果として、appleを<span class="hoge">apple</span> に置き換えていることになります。 ところが問題は、appleとaというキーワードで検索した場合です。 この場合、appleはまず<span class="hoge">apple</span>に置き換えられますが、 str_ireplaceを使用すると、 <span class="hoge">apple</span>のspanのa、classのa、appleのaまでにも、 <span class="hoge"></span>が付いてしまい、表示がおかしくなります。 そこでstrtrを使用すると、最も長いキーワードの appleが優先され、aと被る部分は省かれますので問題はなくなります。 ところがstrtrは大文字小文字を区別しないため、 appleで検索した場合には、 問題なく、appleが強調表示されますが、 APPLEやAppleで検索した場合には、appleと一致しないため、 appleの強調表示がされないことになってしまいます。 ちなみに文章の検索については、 like%%のループで抽出していますので、 appleでもAPPLEでも、全く問題なく、 キーワードに適合する文章はしっかりと表示されます。 検索部分には何の問題もありません。 あくまでも抽出後の強調表示のための置き換え時の問題です。 よろしくお願いします。