「checkText3」が処理されない

このQ&Aのポイント
  • 独学でPHPを勉強中で、サンプルプログラムを動作させようとしています。
  • マニュアル通りに記述しても、「checkText3」の部分だけが上手く処理されません。
  • どこが問題なのかわからず、お分かりになる方がいれば教えていただきたいです。
回答を見る
  • ベストアンサー

「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
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • explode
  • ベストアンサー率100% (6/6)
回答No.1

こんにちわ。 はじめまして。 checkText3($text1); の返り値を受け取る変数が "$srt" になっていますよ。 "$str" に修正すればよいかと思います。 //最後にcheckText3でさよならの対応 if($flag == false) {$srt = checkText3($text1); ↑ココ

ne_ko_mama
質問者

お礼

何度も見直したつもりでした。 あまりに単純なミスでホント情けないです。 ご指摘ありがとうございました<(_ _)>

関連するQ&A

  • 総当たりのアルゴリズムについて

    このジャンルでお願いします。 例えば、「aba」という文字列なら、 a b ab aa aba という要素(順不同です)を得たいと思い、自分なりに作ってみたのですが、 やはり調べる文字数が9文字辺りから処理に時間がかかり重くなってしまいます・・・ もちろんこういうアルゴリズムではそうなることはしょうがないと思いますが、 もう少し効率の良いやり方があればアドバイスをい頂けないでしょうか? 下に自分作った例です(メソッド名とか滅茶苦茶ですが・・^^;)) //文字の総当たりを得る //aba なら a,b,ab,aa,aba class AllCombinationCharacter { private $_characters = array(); public function __construct($text) { $this->_characters = self::split($text); } public static function split($text) { $cnt = 0; $arr = array(); while ($chara = substr($text, $cnt++, 1)) { $arr[] = $chara; } return $arr; } private function setList(&$list, $addText) { if (is_array($list)) { $find = false; foreach ($list as $item) { if (self::isMatchInRandomOrder($item, $addText)) { $find = true; break; } } if (!$find) { $list[] = $addText; } } } private function recursive($list, $addText, $startIndex) { for ($i = $startIndex; $i < count($this->_characters); $i++) { $text = ""; $text .= $addText . $this->_characters[$i]; //echo "t=" . $text . "<br>\n"; $this->setList(&$list, $text); $this->recursive(&$list, $text, $i + 1); } } public function getList() { $list = array(); $this->recursive(&$list, "", 0); return $list; } // 順不同の文字列マッチ // "aba" と ”aab”は一緒(true) public static function isMatchInRandomOrder($text1, $text2) { $tips = self::split($text2); for ($i = 0; $i < count($tips); $i++) { $searchString = $tips[$i]; $text1 = preg_replace("/{$searchString}/", "", $text1, 1); if ($text1 == "") { break; } } if ($text1 == "" && $i == count($tips) - 1) { return true; } return false; } } $obj = new AllCombinationCharacter("abaaxyz"); foreach ($obj->getList() as $item) { echo "t=" . $item . "<br>\n"; }

    • ベストアンサー
    • PHP
  • 戻り値必要なし

    JavaScript初心者です。 戻り値なしの関数について。return とreturn falseでは何か違うのでしょうか? function test(){ if(flag) return; var num=1+2; } function test2(){ if(flag) return false; var num=1+2; } よろしくお願いします。

  • 別サーバにあるファイル存在チェック

    前回の続き的になりますが、サーバは、allow_url_fopen=off の環境です。 色々なサイトを調べてみて、下記コードを発見して、自分なりに修正しましたが、 とにかく重くて仕方ありません。いらないものがあるのでしょうか。 $url = 'http://'.$_SERVER["HTTP_HOST"].$_SERVER['SCRIPT_NAME']; $link_en = (str_replace("www", "www.en", 'http://'.$_SERVER["HTTP_HOST"].$_SERVER['SCRIPT_NAME'] )); function url_exists($link_en) { $arr = parse_url($link_en); $fp = fsockopen($arr['host'], 80); if ($fp == FALSE) return FALSE; $out = ''; $out .= "GET {$arr['path']} HTTP/1.1\r\n"; $out .= "Host: {$arr['host']}\r\n"; $out .= "\r\n"; fwrite($fp, $out); //HTTPコール $res = fgets($fp); //HTTPレスポンス $n = preg_match("/^(HTTP\/[0-9\.]+) ([0-9]+) (.+)/i", $res, $arr); if ($n == 0) return FALSE; $num = $arr[2]; if ($num >= 200 && $num < 400) return TRUE; //HTTP 200-399 ならOK return FALSE; } if (! url_exists($link_en)) { $url_en = "English"; } else { $url_en = '<a href="'.$link_en.'">English</a>'; }

    • ベストアンサー
    • PHP
  • 複数のラジオボタンの選択チェック

    Q1とQ2の2問があり、ラジオボタンで回答を選択するようにしていますが、 ラジオボタンを選択しなかった場合、選択を促すようメッセージを表示させるようJavaScriptで以下のように作成してみましたがうまくいきません。 Q1とQ2の両方を選択しなかった場合、「Q1が選択されていません」とメッセージが表示されますが、Q1だけを選択してQ2を選択しなかった場合はメッセージが表示されません。 いろいろ調べてみたのですが、function checkの使い方に問題があるのでしょうか? function check(){ var flag = 0; if(document.form1.Q1.length) { flag = 1; var i; for(i = 0; i < document.form1.Q1.length; i ++){ if(document.form1.Q1[i].checked){ flag = 0; break; } } } if(flag){ window.alert('Q1が選択されていません'); return false; } else{ return true; } var flag = 0; if(document.form1.Q2.length) { flag = 1; var i; for(i = 0; i < document.form1.Q2.length; i ++){ if(document.form1.Q2[i].checked){ flag = 0; break; } } } if(flag){ window.alert('Q2が選択されていません'); return false; } else{ return true; } }

  • stringのreplace

    import java.io.*; public class ex51c { public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.print("String> "); String str= in.readLine(); if(str.equals("")) { break; } String res = ""; res =str.replace('a', '*') returns str.replace('e', '*') returns str.replace('i', '*') returns str.replace('o', '*') returns str.replace ('u', '*'); System.out.println(res); } } } このようなプログラムを作ってみたのですが、 コンパイル時にエラーが出ます。 どこを直せばいいのでしょうか。教えてください。

    • ベストアンサー
    • Java
  • ヌルバイト攻撃の対策について

    ヌルバイト攻撃の対策について教えて下さい。 一般的な"\0"を削除する方法なのですが、以下の場合ですと問題無ありません。が、 $arr = "abc\0def"; if (mb_strpos($arr, "\0")) { $arr = str_replace("\0", "", $arr); } echo $arr; ※結果:abcdef POST送信された値には、全く反応しません。 $arr = $_POST["arr"];//送信データは"abc\0def" if (mb_strpos($arr, "\0")) { $arr = str_replace("\0", "", $arr); } echo $arr; ※結果:abc\0def スクリプトコードはUTF-8で、magic_quotes_gpcはOffです。 他にどこをチェックすればよいかわからず投稿しました。 チェックすべきところを教えていただけないでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • ラジオボタンとセレクトボックスの選択チェック

    ラジオボタン、セレクトボタンの選択チェックをしたいのですが 同時にチェックする場合どうすればよいのでしょうか。 失敗策ですが、参考までに↓ function check() { var flag=0; if( document.form1.seibetu.length){ flag=1; var i; for(i=0; i<document.form1.seibetu.length; i++){ if(document.form1.seibetu[i].checked){ flag=0; break; } } } else{ if(!document.form1.seibetu.checked){ flag=1; } } if(flag){ window.alert('性別が選択されていません'); return false; } else{ return true; } if(document.form1.nenrei.options[document.form1.nenrei.selectedIndex]. value==""){ flag=1; } if(flag){ window.alert('年齢が選択されていません'); return false; } else{return true; } }

  • 再帰的に処理をする方法

    まとめてサニタイズする方法として下記のように書いてみました。 引数が配列でなければ問題ないのですが、配列だとこんなエラーが出ます。 Warning: array_map() expects parameter 1 to be a valid callback, function 'sanitize' not found or invalid function name in ファイル名 foreachでまわすのも考えましたが、できるならスマートにと思っているのですが どうすれば再帰的な処理ができるでしょうか? $valid = new Valid(); $array = array( 'あああ','いいい','ううう', ); $valid->sanitize( $array ); class Valid{ public function sanitize( $str ){ if ( is_array( $str ) ) return array_map( 'sanitize', $str ); return str_replace( "\0", '', $str ); } }

    • ベストアンサー
    • PHP
  • 以下の関数の解説お願いします。

    Perl初心者のため、stdio.plにある この関数のやっていることがよく分からず困っています。 sub searchString #($str, $key, $mhmode, $lc, $z2h, $k2h, $igmark) { local($str, $key, $mhmode, $lc, $z2h, $k2h, $igmark) = @_; local($once, $from, $to); #static $key2, $key3; return 0 if ($str eq "" || $key eq ""); if ($key eq $key2) { $key = $key3; $once = 1; } else { $key2 = $key; } if ($jcode'version) { if ($k2h) { $from = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポゐゑァィゥェォャュョッ'; $to = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽヰヱぁぃぅぇぉゃゅょっ'; } if ($z2h) { $from .= '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-=_|*!?”#$¥%&@:;'; $to .= '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-=_|*!?"#$\%&@:;'; } if ($igmark) { $from .= '-ー・/_ '; $to .= '------'; } if ($from) { &jcode'tr(*str, $from, $to); &jcode'tr(*key, $from, $to) if (!$once); $str =~ tr/-_\///d; $key =~ tr/-_\///d; } } if ($lc) { $str =~ tr/A-Z/a-z/; $key =~ tr/A-Z/a-z/ if (!$once); } $key3 = $key; if ($mhmode == 5 || $mhmode =~ /^BOOLEAN$/i || $mhmode =~ /^BLN$/i) { local($i) = 0; local(@str, $eval); $key =~ s/ +AND +/ & /gi; $key =~ s/ *NOT +/ ! /gi; $key =~ s/ +OR +/ | /gi; $key =~ s/\( +/(/g; $key =~ s/ +\)/)/g; foreach (split /( & | \| )/, $key) { $str[$i] .= $_; $i ++ unless ($_ eq ' & ' || $_ eq ' | ') } for ($i = 0; $i <= $#str; $i ++) { local($option, $open, $close, $find, $not, $key); $key = $str[$i]; if ($str[$i] =~ /^( & | \| )/) { $option = substr $key, 0, 3; $key = substr $key, 3; } $open = $1 if ($key =~ /^(\(+)/g); $close = $1 if ($key =~ /(\)+)$/g); $key =~ s/\(|\)//g; if ($key =~ /^ *! +/) { $key =~ s/^ *! +//g; $not = 1; } $find = index($str, $key) >= 0 ? 1 : 0; $find = $find ? 0 : 1 if ($not); $eval .= "$option$open$find$close"; } $eval =~ s/ & /*/g; $eval =~ s/ \| /+/g; return (eval $eval >= 1) ? 1 : 0; } elsif ($mhmode == 4 || $mhmode =~ /^NOR$/i) { foreach (split / +/, $key) { return 0 if (index($str, $_) >= 0); } return 1; } elsif ($mhmode == 3 || $mhmode =~ /^EOR$/i) { local($flag) = 0; foreach (split / +/, $key) { if (index($str, $_) >= 0) { return 0 if ($flag); $flag = 1; } } return $flag ? 1 : 0; } elsif ($mhmode == 2 || $mhmode =~ /^OR$/i) { foreach (split / +/, $key) { return 1 if (index($str, $_) >= 0); } return 0; } elsif ($mhmode == 1 || $mhmode =~ /^NAND$/i) { foreach (split / +/, $key) { return 1 if (index($str, $_) == -1); } return 0; } else { foreach (split / +/, $key) { return 0 if (index($str, $_) == -1); } return 1; } } これを呼び出しているのが、別ファイル内の以下の部分です。 foreach(@datafile){ if($datafile[0] eq $_){ next; } # 1行目は項目名なので next if($param{'query_word'}){ unless(stdio::searchString($_, $param{'query_word'}, $param{'query_search_type'}, 1, 1, 1, 1)){ next; } } push(@search_file,$_); } datafileは 名前,住所,電話番号, 吉田,東京都渋谷区,03xxxxxxxx, といったデータファイルです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 条件分岐

    以下の条件分岐について教えてください。 条件:str の 文字に ”0.0”や”0000”などの入力があっ   た場合、NG_FLAGを返したいのです。 どこがいけないのか、教えてください。 int CheckData2(char *str) {  if (str[0] == '0');{   printf("%c", str[0]);   if (str[0] == '0' && str[1] == '.'){    puts("CheckData2はOK_FLAG");    return OK_FLAG;   } else if (str[0] == '0' && str[1] == '.'){    puts("CheckData2はNG_FLAG;");   return NG_FLAG; } } puts("CheckData2はOK_FLAG"); return OK_FLAG; }