• ベストアンサー

使用禁止文字の検索について

たびたびすみません。 文字列の中に使用禁止文字がないかチェックしたいのですが悩んでおります。 "}"が文字列に含まれていないかをチェックするとおかしな事が起こります。 チェックにはstrpos関数を使っています。 例えば、 $res = strpos("パクス・ロマーナ", "}"); print("パクス・ロマーナ結果".$res); とすると 本来ならば結果は false が返るはずなのですが、 「パクス・ロマーナ結果11」となってしまいます。 タブ区切りのcsvファイルの中の文字列をチェックしているのですが それが原因なのでしょうか? 他の文字("'"や"{")については何も問題がないのです。 どなたかご教示していただけますと助かります。 よろしくお願いいたします。

  • lepin
  • お礼率50% (4/8)
  • PHP
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

SHIFT_JISを使っているとこういう事はあたりまえにあります。 SHIFT_JISで「マ」は、\x83\x7bで、2バイト目の\x7bが「}」になるので、US-ASCIIしか想定していないstrpos関数ではうまくいきませぬ。 mb_string系の関数を使うか、全部自前で処理しなければなりません。または、内部エンコーディングをEUCやUTF-8にするか。

lepin
質問者

お礼

そういうことだったんですね... mb_string系の関数を使ってもダメでした。 自前処理を考えたいと思います。 参考になりました、ありがとうございます。

その他の回答 (1)

  • tessyu
  • ベストアンサー率53% (59/110)
回答No.1

$res = strpos("パクス・ロマーナ", "\}"); print("パクス・ロマーナ結果".$res); これで駄目ですか?

関連するQ&A

  • ExcelでのCSVファイルの編集について、

    ExcelでのCSVファイルの編集について、 オートフィルタ機能を使いたいため、 ExcelでCSVファイルの編集しようとしているのですが、ちょっと苦戦しています。。。 私が試してみたこと 1.もとのCSVファイルの拡張子を○○.csv → ○○.txtに変更。   ↓ 2.Excelの「開く」からその○○.txtを読み込む。   ↓ 3.テキストファイルウィザードに従い、   1「カンマやタブなどの区切り文字によって~ 」にチェック   2「区切り文字」→ カンマ、「文字列の引用符」 → "   3「列のデータ形式」 → 文字列 ※090などの数字を、90と先頭の0を消されないように 上記のような手順でCSVファイルを取り込み、編集を終え、 保存する時は   「○○.txtにはテキスト(タブ区切り)と互換性のない機能が含まれている可能性があります。    この形式でブックを保存しますか?」 → このまま保存するため「はい」を選択 これでバッチリOK!…かと思われたのですが、 元の編集前の○○.txt は"名前","ヨミ","電話番号1", …… ""とカンマ区切りであったのが、 編集後の○○.txtは名前 ヨミ 電話番号1  …… タブ区切り(?) となってしまっています。 (CSVファイルとしてはタブ区切りでも問題ないのでしょうが…) どうすれば元のカンマ区切りの形式のまま保存できますでしょうか。 アドバイスよろしくお願い致します。

  • 文字列検索の方法

    ○.csvという複数のファイルがあります。 内部のデーターは「,」区切りになってます。 複数のファイルの中に、あるキーワードに一致する文字列を含む ファイル名を一覧で表示する方法(プログラム)を教えてください。 雰囲気は全文検索みたいな感じです。 関数や簡単なプログラムであれば、例をあげて頂ければ幸いです。

    • ベストアンサー
    • Perl
  • javascriptで入力禁止文字をチェック

    javascriptで入力禁止文字をチェック 初めて質問させていただきます。 javascriptで入力フォーム(テキストフィールド)に入力された文字列の中に入力禁止文字がないかをチェックしたいとおもっております。 例えば、テキストフィールドに「バカ」「ハゲ」等と入力されており、送信ボタンを押すと「入力禁止文字が含まれています」とアラートが表示されるといったものです。 入力禁止文字がなければ、送信ボタンをクリックし、指定されたURLへジャンプしたいと考えています。 javascriptのソースをお教えいただけたり、参考になるサイトをお教えいただければ助かります。 よろしくお願いします。

  • textareaの入力禁止文字チェック

    こんにちは。 初歩的なことかもしれませんが、不思議な現象?に困っています。 textareaから入力された文字列の中に入力禁止文字がないかどうかチェックしたいのですが、textareaで改行を行った場合、一番下の行のチェックしか出来ません。 ソースは以下です。 if (preg_match("/[$check_word]+$/",$text)){ $msg = '本文に入力禁止文字が含まれています'; } なお、改行コードを削除してからチェックしても、同じ現象が起こっています。 //$text = preg_replace("/\n|\r/","",$text); どなたか回避策などご存じないでしょうか><

    • ベストアンサー
    • PHP
  • splitしない文字列について

    split("\t",$moji) で$mojiを分割しているのですが、タブ区切りなのに分割しない文字列があります。 企業秘密な所もあり、問題の文字列そのままを報告できないのですが、分割をキャンセルするような文字コードってあるのでしょうか? その文字コードであやしい物は 「 」:スペース 「!」、「♪」 などが含まれています。 通常であれば10個に分割される文字列がまったく分割されなく分割数は1と出ます。もちろんタブ区切りになっています。 1つの文字列だけの事なのです。原因はまったく不明。よろしくお願いします。

    • ベストアンサー
    • PHP
  • CSVの禁則文字

     VB等からCSVファイルを生成する際に文字情報の中に含まれる 禁則文字 (例:カンマ等) をチェックする必要がありますが、 考えられる範囲ではカンマしか思いつきませんでした。 他にチェックする文字列はありますでしょうか? CSVファイルを生成する際の禁則文字を教えて下さい。

  • 「checkText3」が処理されない

    とあるHOWTO本を見ながら、独学でPHPを勉強中です。 サンプルプログラムを動作させようとマニュアル通りに記述してみたのですが、一部分だけが上手く処理されません。 付属CDに収められているphpファイル自体がこのような記述になっている為、マニュアル自体に間違いがあるのかな?と思うのですが、 どこがおかしいのか解らずにいます。 お分かりになる方がいれば、ご教授願えませんでしょうか? 上手く処理されないのは「//テキストチェック3.バイバイされたらバイバイを返す」の部分です。 よろしくお願い致します<(_ _)> <?php $res = ""; if(isset($_POST['text1']) == false) {$res = getAisatsu();} else{$text1 = $_POST['text1']; if($text1 == "") {$res = "え? なんていったの?";} else{$flag =false; //まずcheckTextであいさつ文をチェック $str = checkText($text1); if($str != false) {$flag = true; $res = $str; } //続いてcheckText2で悪口の対応 if($flag == false) {$str = checkText2($text1); if($str != false) {$flag = true; $res = $str; } } //最後にcheckText3でさよならの対応 if($flag == false) {$srt = checkText3($text1); if($str != false) {$flag = true; $res = $str; } } //すべてダメならテキストを分解してチェック if($flag == false) {$arr = bunkatsu($text1); foreach($arr as $str) {if(getWordCheck($str) == true) {$flag = true; $res = $str . "って、なぁに?"; break; } } } //それでもダメなら全文で聞き返す if($flag == false) {$res = delTouten($text1) . "って、なぁに?";} } } //時間によって異なるあいさつ文を返す function getAisatsu(){ $arr = array('……ね、眠い','おはよう!','こんにちは~','こんばんわ',); $d = getdate(); $t = $d['hours']; $t2 = (int)($t / 6); return $arr[$t2]; } //テキストチェック。あいさつ文があれば対応する挨拶を返す function checkText($s){ if($s == ""){return false;} $res = false; $data = array('こんにちは','こんにちわ','こんちは','こんちわ'); foreach($data as $str) {if (mb_strpos($s,$str) !== false) {$res = 'どうも、' . $str . '!'; break; } } return $res; } //テキストチェック2.悪口が書かれていたら文句をいう function checkText2($s) {if ($s ==""){return false;} $res = false; $data = array('バカ','馬鹿','あほ','アホ','阿呆'); foreach($data as $str) {if(mb_strpos($s,$str) !== false) {$res =$str . 'じゃないもん!'; break; } } return $res; } //テキストチェック3.バイバイされたらバイバイを返す function checkText3($s) {if ($s == ""){return false;} $res = false; $data = array('ばいばい','バイバイ','じゃあね'); foreach($data as $str) {if(mb_strpos($s,$str) !== false) {$res = 'それじゃ' . $str . '!'; break; } } return $res; } //句読点を削除する function delTouten($s) {$res = str_replace('。','',$s); $res = str_replace('?','',$res); $res = str_replace('!','',$res); $res = str_replace('.','',$s); $res = str_replace('?','',$res); $res = str_replace('!','',$res); return $res; } //テキストを句読点で分割し、配列として返す function bunkatsu($s) {mb_regex_encoding("sjis"); $res = mb_ereg_replace('[。、?!,.!?]','',$s); $arr = mb_split(' ',$res); return $arr; } //主語や接続詞が含まれているかを調べる function getWordCheck($s) {if ($s == ""){return false;} $res = $s; $data = array('私','わたし','僕','ぼく','俺','おれ','オレ'); foreach($data as $str) {if(mb_strpos($s,$str) !== false) {$res = false; break; } } return $res; } //サニタライズ function getSeftyText($s) {$res = str_replace("<","<",$s); $res = str_replace(">",">",$res); return $res; } ?>

    • ベストアンサー
    • PHP
  • VLOOKUPで●●を含む文字列を検索したい

    VLOOKUP関数を使って、検索値をD列、範囲をAB列にして、 B列の値段をE列に表示させたいと思っています。     A列        B列  C列     D列     E列 おいしいオレンジジュース   150 りんごジュース りんごジュース 天然果汁   200 オレンジジュース 検索範囲の文字には検索値の文字が含まれてはいるのですが、前や後ろ、もしくは前後両方に文字が追加されています。 あれこれ調べましたが、逆の条件の場合は他の関数+ワイルドカードの組み合わせでできるようでしたが、 自分がやりたいことは調べきれず、質問させていただきました。 一応、TRUE、FALSEで切り替えて検索してみたのですが、希望している結果とは違うものが出てしまいました。 (同じ結果が何度もダブって出る。データ的に1対1しかないのに) 文字列の場合のVLOOKUP関数のTRUE、FALSEの定義もよくわかりません。

  • データ検索

    PHPからMYSQLのデータを検索するごくごく簡単なプログラムを作ってみようと思いました。 どうやらデーターベースにアクセスしていないような・・・・・??? 初心者です。申し訳ありませんがよろしくお願い致します。 <? $db = mysql_connect(); mysql_select_db('suzu'); //前画面からのパラメータ $ab = $_POST["Memb"]; //一致データ検索 $sql = " select * from Toshokan \n " . " where to_menb = '$ab' " ; $res = mysql_db_query($db,$sql); $arycol = mysql_fetch_array($res,MYSQL_ASSOC); print ("$ab"); print ("###"); print ($res["to_menb"]); print ("***"); print ("$FMemb"); print ("###"); print ($arycol['to_post1']); if ( $res == $FALSE ) { die("新規登録"); } else { die("更新"); } mysql_free_result ($res); mysql_close($db); ?> 結果 上記の print ($res["to_menb"]); print ($arycol['to_post1']); は出力されずにダミー状態です。 データーベースにアクセスされていないと考えたのですが、、、、、 どなたかご教授いただければ幸いです。

    • ベストアンサー
    • PHP
  • PHP+mySQLでのCSV→DB登録で文字化けします

    現在タブ区切りのCSVファイルをPHPで取り込み mySQLへINSERTするものを作ろうとしているのですが INSERTするモノに全角が入ると文字化けているせいか mysql_queryでFALSEが帰ってきてしまいます。 使用環境、コードを以下に書きます。 どこかおかしな点等ありましたらご教授お願い致します。 OS:windowsXP PHP:Ver5.2.6、default_charset UTF-8 mysql:Ver5.0.51a UTF-8 取り込みたいCSV:Shift_JIS,CRLF,タブ区切り コード(一部) while(!feof($fp)){ $buf = fgets($fp); $buf = mb_convert_encoding($buf, "UTF-8", "Shift_JIS"); $buf=str_replace('\r\n', '\n', $buf); $array = preg_split("/\t/", $buf); if($array[0] == "") { break; } else { //INSERT用に加工( $values = replaceValues($array); } $sql = "INSERT INTO table_name VALUES($values)"; $res = mysql_query($sql); if(!$res){ echo "登録に失敗しました。"; echo "sql:".$sql; mysql_close($conn); exit; } $cnt++; }

    • 締切済み
    • PHP