質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.00%

空白以外の文字列が一文字でもその変数に含まれているかどうかの判定

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 776

ss_111

score 17

変数に格納された文字列に対して、空白(全角、もしくは半角)以外の文字列が一文字でもその変数に含まれているかどうかを判定したいのですが、どのような方法が考えられますでしょうか?
検索し、調べたのですが、そのような方法はヒットしませんでした...
追記
調べた内容は、文字列を検索する必要があると思った為、キーワードに「文字列」「空白」「検索」や「空白のみ検索」などを入れ、検索し、文字列検索の関数をみつけましたが、それを生かす方法が分からず、ロジックを考えている過程で詰まってしまいました

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/09/03 14:17

    それに回答がついたからって「その回答をヒントにやってみてできなかったからそれを”試したこと”に含めてはいけない」なんてルールはありません。
    「〇〇さんの回答をもとにやってみた結果です」と質問に追記してしっかりコミュニケーションをとって問題を詰めていけばいいだけの話。
    問題解決なんて試行錯誤の連続。一問一答で済む方が稀です。
    解決までの経緯や道筋がきちんと残っていたほうが後から見たときに自分のためにも同じような問題を抱えた人のためにもなるでしょう。それが「ロジック」となるので。

    キャンセル

  • 退会済みユーザー

    2019/09/03 16:44

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • m.ts10806

    2019/09/03 18:22

    今度から「コピペで動くコードください」って必ず書くようにしてくださいね。
    まともな質問にしないまま解決にしたということはそういうことですからね。分かってないみたいだけど

    キャンセル

回答 5

+9

こういう場合どうしたらいいかなとなった時に 行うべき方法 を教えます。

PHPのリファレンスは以上によくまとまっていて、まず、 関数リファレンス一覧のページをブックマークしておきます 。

https://www.php.net/manual/ja/funcref.php

とくに、「文字列」や「配列」関連のページは今後よく見るページになるでしょう。

今あなたがやりたいことは、「変数に格納された文字列に対して、空白(全角、もしくは半角)以外の文字列が一文字でもその変数に含まれているか」なのですから、「文字列」関連の関数を調べる。

https://www.php.net/manual/ja/book.strings.php

こちらですね。

文字列を操作する関数はこんなにありますが、 全てを覚える必要はありません
一覧の中から使えそうな関数を 毎回探せばいい のです。

これ使えそうだなと思ったら、 詳細のページをみて、使い方を調べながら、コードを書いて試してみる。これを繰り返せばいいのです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/03 15:04

    >そしてそういった回答者は「しらねぇよ!仕様で納得しろ!」などと乱暴な回答で質問者に納得させようとします

    なるほど
    https://teratail.com/questions/209705
    この質問のことを言っているのなら「”仕様”としか言いようがないところをドキュメントやコードなどを読んで想像・理解したことを伝えた」で納得してない質問者に非がありますね。
    最初から「仕様だからそこで納得しろ」なんて言ってないですし、そもそもどこにも「しらねぇよ!仕様で納得しろ!」なんて書いてないですし、「そこまで納得できないなら開発者に問い合わせて」と言っているだけなのに。

    キャンセル

  • 2019/09/03 15:09 編集

    なお、まともな質問の仕方のヒントは2019/09/03 14:38の私のコメントで
    非常にフランクに書きましたのでそちらをどうぞ。

    これだけ多くの回答者を引っ張りだしておいて「勝手に出てきただけ」というスタンスは許されません。
    そもそも、もともと、質問を解決する責任は投稿した質問者のみにあり、どんな嘘回答をしていたとしても回答者の責任は負えません。
    その回答・アドバイスを採用する質問者の責任です。
    もちろん嘘回答にはそれなりの評価や指摘が入ります。
    今回の質問の低評価が6つもついていることであったり、回答でKosuke_Shibuyaさんの回答が筆頭である以上は、質問者がとるべき行動は自明でしょう。

    キャンセル

  • 2019/09/03 16:17

    回答者どうだこうだ言う前にまずは追記 依 頼 を実行なさっては?
    それもできないようならteratail以前、質問者以前の問題です。

    キャンセル

checkベストアンサー

+1

「空白(全角、もしくは半角)以外の文字があるか」をどう判定するか?
の回答としては厳密には異なる回答だったので、編集しました。
※ 元の回答は下部に残しておきます

空白(全角、もしくは半角)以外の文字が存在するかどうかは、
空白(全角、もしくは半角)を取り除いた文字列が空文字("")であるかどうかで判定します。

  • 空白(全角、もしくは半角)を取り除いた文字列が空文字("")なら、全て空白(全角、もしくは半角)であるということなので、空白(全角、もしくは半角)以外もの字は存在しない。
  • 空白(全角、もしくは半角)を取り除いた文字列が空文字("")以外なら、空白(全角、もしくは半角)以外の文字が残っているので存在する。
foreach(array("ab","a b","ab ","a b"," ","  "," ") as $str){
    if (str_replace(array(" "," "),"", $str) == "") {
        echo "[".$str."]: Not exists non space character." . PHP_EOL;
    } else {
        echo "[".$str."]: Exists non space character." . PHP_EOL;
    }
}

---- 

以下では、空白(全角、もしくは半角)が存在するかどうかを判定するロジックでした。

空白(全角、もしくは半角)を取り除いた文字列と元の文字列と比較した結果で判定します。
同じなら含まれないし、異なれば含まれます。

<?php

foreach(array("ab","a b","ab ","a b"," ","  "," ") as $str){
    if (str_replace(array(" "," "),"", $str) == $str) {
        echo "[".$str."]: Not exists space character." . PHP_EOL;
    } else {
        echo "[".$str."]: Exists space character." . PHP_EOL;
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/03 15:21

    質問内容はY.H.さんのstr_replaceを使うのがわかりやすいです。
    別の変数に空白を削除し格納してifで文字があるか調べるのがわかりやすいかな
    $str1 = str_replace(array(" "," "),"", $str);

    キャンセル

  • 2019/09/03 17:41 編集

    ご回答ありがとうございます。
    このような単純な方法で、実装することができるのですね...
    対象の変数は配列ではなく、文字列を格納した変数を想定していましたが、配列でも使えますね...
    勉強になりました。

    キャンセル

  • 2019/09/03 18:35

    > 対象の変数は配列ではなく
    単に7パターンのテストをやりたかったので配列にしてforeachでループしているだけです。
    判定自体はif文の行1行のみで、配列ではなく文字列変数を対象に判定しています。

    キャンセル

+1

なるほど、大喜利ですか

<?php
$hoge = 'ここに文字列';
$hoge = str_replace(' ','',$hoge);
$hoge = str_replace(' ','',$hoge);
$hoge = str_replace('    ','',$hoge);
if (empty($hoge)) {
echo 'なかったよ';
} else {
echo 'あったよ';
}
<?php
$hoge1 = "ここに文字列";
$hoge2 = mb_strlen($hoge1);
for ($i = 0; $i < $hoge2; $i++) {
  $hoge3 = mb_substr($hoge1, $i, 1);
  if (preg_match("/\S/", $hoge3)) {
    echo "残念";
    break;
  } else {
    echo "OK";
    break;
  }
}

どっちにしてもbreakする(文法的にいいのかな?)意味不明なコード。(もうちょい長くしたかった)

このまま納品先に出しても怒られると思うので知りません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/03 17:25 編集

    低評価多いですね〜

    キャンセル

  • 2019/09/03 17:31

    質問が質問だから仕方ないかもしれません。
    大喜利回答で低評価つかなかったことがないです。

    キャンセル

  • 2019/09/03 17:42

    まぁ誰かしらの助けになるかもしれないのでw

    キャンセル

-1

文字列 空白 検索 php
で検索したら、2~3ステップ程度でできそうなものが簡単に見つかりました。
どうようにやってみてください。すごく簡単です。
(あなたは何を見つけ、それをどのように使おうとしてロジックを考えて詰まったのですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-2

$a=["ab","a b","ab ","a b"," ","  "," "];
$pattern="/[^\x20\xE3\x80\x80]+/u";
foreach($a as $str){
  if(preg_match($pattern,$str)){
    print "[".$str."]<br>";
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/03 13:43

    u指定子付きであれば、UTF-8の1コードポイントも1文字として認識されますので、/[  ]/u(角括弧の中身は半角スペース+全角スペース)のように書けます。

    uなしでコードポイントをバラで書く、あるいは1バイトでない文字を角括弧の中に書くなどすると、(今回の場合は\xe3\x80\x80であって、\xe3と\x80で出来上がるvalidな文字が全角スペース1つしかないから正常動作したのですが)コードポイントの「組み合わせ」すべてが通ってしまうので、思ったところに絞れません。

    キャンセル

  • 2019/09/03 13:47

    maisumakunさん、補足ありがとうございます

    逆に想定外のものをヒットさせる場合の具体例をだせますか?

    キャンセル

  • 2019/09/03 13:57

    'ぷ'が、/[あシ]/にヒットします。

    ぷ→e3 81 b7
    あ→e3 81 82
    シ→e3 82 b7
    https://3v4l.org/s1CSd

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る