• 締切済み

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が表示する文章です。

  • PHP
  • 回答数1
  • ありがとう数1

みんなの回答

  • kamikami30
  • ベストアンサー率24% (812/3335)
回答No.1

どういった仕様の文章いくつから、 どういったいくつのキーワードを 検索してそれぞれで違う色などに変えたいのか 複数のキーワードなら一括して同じ色などにかえたいのか 最低これを埋めると、何したいのか伝わります。 1つの文字列の、範囲から、1つの文字列を検索して、ヒットした文字列を強調表示はできるんですよね? 該当箇所というのは質問のどの部分に該当しているの? 質問内容には該当していないと思いますけど。 置き換える処理はしてないし。 置き換えしたい処理を実際にメモ帳等でやったら何すればいいか少しは見えてくるかと思います。

kayakiss
質問者

お礼

さらに置き換え処理の部分だけを取り上げた説明です。 例えば下記のような文章があったとします。 ---これは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では一致しなくなってしまいます。 このような問題になります。

kayakiss
質問者

補足

説明ベタ、説明不足にて申し訳ありません。 まず文章ですがタグ等一切含まれていない 単純なテキストデータが多数(数百件)です。 キーワードは数字・文字列あらゆるものを受け付けます。 また文字数も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でも、全く問題なく、 キーワードに適合する文章はしっかりと表示されます。 検索部分には何の問題もありません。 あくまでも抽出後の強調表示のための置き換え時の問題です。 よろしくお願いします。

関連するQ&A

  • strtrの場合の大文字小文字区別なしの解消

    strtrは大文字小文字を区別してしまうようなのですが、 こちらを区別せずに使用する方法はありませんでしょうか? 例えば下記のような文章があったとします。 > これはappleでaです。 この場合のappleとaだけに spanタグをつけて強調表示したい場合です。 $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では一致しなくなってしまいます。 このような問題を解決するためには どのような方法がありますでしょうか?

    • ベストアンサー
    • PHP
  • JavaScriptで連続する空白を、htmlタグ付きで別の文字の連続

    JavaScriptで連続する空白を、htmlタグ付きで別の文字の連続に置換する方法 ※可視化のため下記のサンプルでは、空白を「_」で表現しています 「_」の連続を、「#」の連続とそれをタグで囲んだ状態にしたいと思っています。 やりたいことはこんな感じです。 (0):置換前:hoge_hogehove___asd#bn__ (1):置換後:hoge<span class="…">#</span>hogehove<span class="…">###</span>asd#bn<span class="…">##</span> しかし正規表現の書き方が分からなかった為、現状のコードはこんな感じにしています。 str.replace(/_/g, "<span class='…'>#</span>"); 実行結果はこうなります。 (2):現状:hoge<span class="…">#</span>hogehove<span class="…">#</span><span class="…">#</span><span class="…">#</span>asd#bn<span class="…">#</span><span class="…">#</span> 無駄に長いのですがとりあえず現状でも、htmlとして表示したときの結果は間違っていません。 しかし ・正規表現を十分に理解できていないレベルの低いコードっぽい ・最終的には比較的多くの文字列を処理をする ・保持しておいて繰り返し表示するので置換後の文字列を小さくしておきたい と思っています。 (0)を(1)の状態に変換する方法を教えてください。 出来れば正規表現でシンプルにパシッと決める方法を希望しています。 よろしくお願いします。

  • phpでhtmlソースを解析し、文字を抜き出したいのですが、上手くきま

    phpでhtmlソースを解析し、文字を抜き出したいのですが、上手くきません。 <span class="a">あ</span> <span class="b">い</span> <span class="a">う</span> <span class="b">え</span> <span class="a">お</span> <span class="b">か</span> このようなソースから「あいうえお」の部分だけを抜き出したいのです。 以下のようにしているのですが、改行が無い場合は上手く取得できるのですが、 以下のような形で途中に改行が入っている場合、上手く取得できません。 <span class="a">あ </span> このような場合でも取得できるようにするにはどうすればよいでしょうか。 $lines = file("http://~~"); foreach ($lines as $line) { preg_match('/<span class="a">(.*?)<\/span>/ms', $line, $match); preg_match('/<span class="b">(.*?)<\/span>/ms', $line, $match); } msをつけておりますが、 この場合は1行1行ループしているために意味がない状態になるのでしょうか。 どのようにすれば取得させることができるのでしょうか。 お手数をおかけしますが何卒よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 一部文字の上下padding設定について

    以下ソースを作成しました。 最後にPタグ、Aタグの中身に 文字を記述しています。 ・文章 <p class="pst">ここに<span class="try">テスト</span>文章段落1</p> <a class="ast" href="#">ここに<span class="try">テスト</span>リンク1</a> 両方の文章に存在するspanで囲まれている[テスト]という文字の上下paddingを設定して、 テストだけ文字位置の高さを変えたいのです20pxほど「テスト」という文字を、上または下に動かしたい。(=ずらしたい) 以下ソースを記述しましたが、 左右のpaddingは有効になったのですが、 上下paddinが有効になりません。 どのようにしたら良いのでしょうか ご教授よろしくお願いします。 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Style-Type" content="text/css"> <style type="text/css"> .pst{ background-image: url("back.jpg"); padding:10px; } .ast{ display:block; padding:10px; background-image: url("back.jpg"); } .try{ padding:10px; } </style> </head> <body> <p class="pst">ここに<span class="try">テスト</span>文章段落1</p> <a class="ast" href="#">ここに<span class="try">テスト</span>リンク1</a> </body> </html>

    • ベストアンサー
    • CSS
  • cssで一部の文字や画像を中央に寄せる方法

    よろしくお願いします。 まずhtmlに以下の記述をしております。 <p class="font"> スタイルシート <span class="color2">レッスンブック</span> パソコン <img src="img/hoge.gif" alt="テスト" width="250" height="130" /> インターネット プリンター </p> レッスンブックについてのみ文字色を変えたいため<span>を使用しております。 <p class="font">~</p>にはtext-align:leftを;適用しており 当然ですが、左に寄ります。 ですが一部の文字や画像のみを中央揃えにしたいのですが、きっとclass名を入れれば良いのだと思うのですが、具体的にどこに記述したら良いのか分かりません。 上記のimgと「レッスンブックのみを中央揃えにしたいと思っております。 ご指導よろしくお願いします。

    • ベストアンサー
    • HTML
  • webページ内のidの値をphpで抽出させるには?

    あるphpで出力されているwebページ(http://www.hoge.com/hoge.php) 内の <div align="center"><span class="style8" id="nu_text">2011-09-01 12:34:56 0.66 </span></div> の 2011-09-01 12:34:56 0.66 の部分だけをphpで抽出したいと思います。 どのような方法がありますか。 抽出元サーバは coreserverです。 よろしくお願いいたします。

  • 正規表現で特定のHTMLタグのクラスから文字列を取り出したい

    はじめまして。 現在PHP勉強中の者です。 タイトル通りクラス付けされたHTMLタグ内の文字列を取り出したいのですが、上手くいかず困ってます。 利用サーバーはコアサーバーで環境は下記通りになります。 apache:1.3.37 PHP:5.2.5 スクリプトはUTF-8、HTMLもUTF-8です。 タグは<span class="hoge">文字列</span> のような感じです。 preg_match_all("/<span class=\"hoge\">(.*)</span><\/em>/", $html, $results); こんな感じでやってるんですが引っ掛かりません。。。 よろしくお願いします。

    • 締切済み
    • PHP
  • 文字の置換?

    http://php.eweb-design.com/1301_mail.html さんから 文字コードEUC版をダウンロードさせいていただて、フォーム作成の勉強をしているのですが、疑問に思う点がいくつかあります。 if($esse == 1) { $flag = 0; $length = count($eles) - 1; foreach($_POST as $key=>$var) { $key = strtr($key, $string_from, $string_to); if($var == "eweb_submit") ; else { for($i=0; $i<=$length; $i++) { if($key == $eles[$i] && empty($var)) { $errm .= "<FONT color=#ff0000>「".$key."」は必須入力項目です。</FONT><BR>\n"; $flag = 1; } } } } の部分の $key = strtr($key, $string_from, $string_to); のところなのですが、$keyに含まれる文字から$string_fromを検索し$string_toに置換することだと思うのですが、、、$string_fromも$string_toも どこの記述を見ても文字列が代入されていません。 過去ログを見ると http://oshiete1.goo.ne.jp/qa3140724.html?ans_count_asc=2 // 文字の置き換え $string_from = "\"; $string_to = "ー"; のような記述があるようなのですが、私がダウンロードしたファイルにはありません。どなたか詳しい方がいらしたら教えてください。 あと、 //--- メールのレイアウトの編集 --- 開始 -------------------> $body="「".$sbj."」からの発信です\n\n"; $body.="-------------------------------------------------\n\n"; foreach($_POST as $key=>$var) { $key = strtr($key, $string_from, $string_to); if($var == "eweb_submit") ; else $body.="[".$key."] ".$var."\n"; } $body.="\n-------------------------------------------------\n\n"; $body.="送信日時:".date( "Y/m/d (D) H:i:s", time() )."\n"; $body.="ホスト名:".getHostByAddr(getenv('REMOTE_ADDR'))."\n\n"; //--- 終了 ---> というところで、 if($var == "eweb_submit") ; else $body.="[".$key."] ".$var."\n"; のようにifのあとにすぐelseがきているのはどうしてですか? まったくの初心者で、申し訳ないですが、 どうぞ、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • mediawikiで自前のWEBフォントの利用

    お世話になります。 現在mediawikiでwikiページを作成していますが、自前のフォントをサーバーにアップしておいて、そのフォントを使用するということは可能でしょうか? 例えば下記のように編集ページで指定した文字をclass指定したhtmlタグで囲んだらその文字を特殊なフォントで表示するような形です。 <span class="hoge">アイウエオ</span> (class"hoge"で囲った文字を特殊文字で表示) また、検索時にもその文字が使え、検索結果の文字にも使えると尚よいです。 最低でも指定した文字に使用する様な形は実現したいと思います。 ご存知の方、よろしくお願い致します。

  • 写真と文字の大きさをそろえたい

    ビルダーを使いながらやっているのですが 二つのものを左右に並べて上下同じ大きさで表示したいのですが、 下記では同じ大きさになっていると思うのですが、 大きさが(上下の大きさのみ※左右は異なってよいのですが) ことなって表示されてしまいます。 解決方法を教えてください。。。 <DIV style="width : 191px;height : 335px;top : 94px;left : 157px; position : absolute; z-index : 10;" id="Layer8" class="hpb-lb-tb1-cell1" align="center"> <SPAN class="hpb-body4"><SPAN STYLE="line-height:1"><span style="font-size:15pt"> <B><STRONG>ここに文字</STRONG></B></SPAN></SPAN></SPAN> </DIV> <DIV style="width : 412px;height : 295px;top : 94px;left : 347px; position : absolute; z-index : 9; " id="Layer9" class="hpb-lb-tb1-cell2" align=""><IMG src="hpb_i_top10.jpg" alt="イメージ" width="412" height="295"></DIV>