PHP の文字列検索と置き換えの際の大文字小文字の区別について


ある文字列を検索し、マッチがあった場合にその文字のフォント装飾を変えるスクリプトを作りたいのですが、期待する結果が得られずに困っています。説明すると長いので例を出します。

たとえば、文字列中に "question" という単語 (大文字小文字の区別なし) が出てきたら、その単語をボールドにしたい場合
$search = "question";
str_replace ($search, "<span class='bold'>".$question."</span>", "I have a Question");
これではヒットしないので置き換えは行われません。そこで、str_replace から str_ireplace にすると
str_ireplace ($search, "<span class='bold'>".$question."</span>", "I have a Question");
これではボールドになりますが、置き換え後が "I have a question" のように単語の先頭が小文字なってしまいます (当たり前ですね)。

検索の際には大文字小文字の区別なく検索し、ヒットした場合は"元の文字列の大文字小文字を維持したまま"フォント装飾だけを行いたいと思っています。
何かスマートな方法はないでしょうか?

因みに、単語の語頭だけを処理すればよいというわけではなく、QUESTION や quEstion というパターンにも対応したいです。

PHP 5.3.0
Apache 2.2.11
Win XP Home

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

ベストアンサー

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351

ポイント50pt

iオプションを指定すると大文字小文字を区別しません。

$text = 'I have a Question.<br />and I Have a QuesTion';
$search = '/(question)/i';
echo preg_replace($search, "<span class='bold'>$1</span>", $text);

perl互換の正規表現なので、()内のマッチした文字列を$1、$2・・・というように参照することが出来ます。

http://homepage2.nifty.com/buckeye/software/helps/st/pages/regul...

※言語やソフトによって実装状況が異なります。

id:Nigitama

ばっちりです。

$1、$2 のように参照できるとは知りませんでした。

ありがとうございます。

2010/02/26 16:39:44

その他の回答1件)

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351ここでベストアンサー

ポイント50pt

iオプションを指定すると大文字小文字を区別しません。

$text = 'I have a Question.<br />and I Have a QuesTion';
$search = '/(question)/i';
echo preg_replace($search, "<span class='bold'>$1</span>", $text);

perl互換の正規表現なので、()内のマッチした文字列を$1、$2・・・というように参照することが出来ます。

http://homepage2.nifty.com/buckeye/software/helps/st/pages/regul...

※言語やソフトによって実装状況が異なります。

id:Nigitama

ばっちりです。

$1、$2 のように参照できるとは知りませんでした。

ありがとうございます。

2010/02/26 16:39:44
id:matsubobo No.2

回答回数20ベストアンサー獲得回数3

ポイント20pt

こちらでいかがでしょうか?

preg_replace('/(question)/i', '$1', 'QueStion'); // outputs QueStion

id:Nigitama

ありがとうございます。

こんなにスマートに解決できるとは思いませんでした。

2010/02/26 16:39:57

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

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

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

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

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