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

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

ただいまの
回答率

88.92%

配列の要素から空白文字のみまたは空文字の要素を削除する方法

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 186

study_111

score 75

前提・実現したいこと

配列の値から、半角空白、全角空白,空文字のみの要素を削除したいです。

発生している問題・エラーメッセージ

index.htmlから受け取った文字列を「,」で区切り、配列に代入し、その後各要素に対して空白文字のみ、または空文字の要素を削除したいのですが、方法が分からないです。
以下のコードでは、仮に「test1,te  st1,test3  ,    ,,」といった文字列をformのtextareaから入力しarray_filterにかけたのですが、空白文字のみの要素が出力されてしまいます。

  $tag_array = array_filter($tag_array,'strlen');


var_dumpの結果、以下のように出力されました。

array(4) { [0]=> string(5) "test1" [1]=> string(7) "te st1" [2]=> string(7) "test3 " [3]=> string(4) " " }

該当のソースコード

以下は、index.htmlです

<form method="post" enctype="multipart/form-data" action="upload.php">
     <p>タグ: <textarea class="description" name="tag" rows="5" cols="50"></textarea></p>
     <p>動画ファイル: <input type="file" name="movie_file"></p>
        <button type="submit">アップロード</button>
    </form>


以下は、upload.phpです

if(isset($_POST['tag'])){
    $tag = $_POST['tag'];

    if (mb_strlen($tag, 'UTF-8') > 500){
        $err_msg[] = 'タグに登録出来る文字数は500文字以内です';
    }else{
        $tag_array = explode(',',$tag);
        $tag_array = array_filter($tag_array,'strlen');

        // var_dump($tag_array[3]);
        $tag_array = array_unique($tag_array);
        var_dump($tag_array);
    }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

0

$tag_array = array_filter($tag_array,function($x){
  return preg_match("/\S+/misu",$x);
});

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/06 17:50

    ご回答ありがとうございます。
    一点お聞きしたい点があるのですが、正規表現の「/misu」の部分は何を表しているのでしょうか?

    キャンセル

  • 2020/07/06 17:59

    オプションです。今回はu以外はいらないですね。
    (uを指定しないと全角スペースがヒットしない)

    キャンセル

  • 2020/07/06 18:09

    ご返信ありがとうございます。
    オプションだったのですね。オプションについても、調べてみたいと思います。

    キャンセル

0

正規表現を使用する形となりますが、、
空白文字のみ、を削除する場合はpreg_replace
空文字の要素、を削除する場合はpreg_grep
を使用することで出来ると思います。

$a = "test, te st2, test3 ";
var_dump(explode(",",  preg_replace("/\s+/","",$a)  )); // 空白文字のみ
/*
array(3) {
  [0]=>
  string(4) "test"
  [1]=>
  string(5) "test2"
  [2]=>
  string(5) "test3"
}
*/

var_dump(  preg_grep("/^[^\s]*$/",explode(",",$a))  ); // 空文字を含む要素
/*
array(1) {
  [0]=>
  string(4) "test"
}
*/

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

strlenですと半角全角スペースが文字列としてカウントされてしまうのでcallback関数を用意して
最初に半角全角スペースを排除してからstrlenでチェックするか、
preg_matchで半角全角スペース以外の文字があるかどうか調べたらいいと思います。

*また、現状ですと入力データにhtmlタグを入れられるとおそらく希望の動作ににならないと思うのでチェックを入れたほうがいいと思います。
同様に入力データに\n\tなど入れられたケースも考慮したほうがいいと思われます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/06 17:47

    ご回答ありがとうございます。
    > 現状ですと入力データにhtmlタグを入れられるとおそらく希望の動作ににならないと思うのでチェックを入れたほうがいいと思います。
    こちらですが、試しに「<html></html>」を入れてみましたら、空文字?と判定されてしまいました。
    こちらは何故このような現象が起きてしまうのか、教えて頂けますでしょうか...?

    キャンセル

  • 2020/07/06 17:59

    空文字として判定されました?
    だとするとPOST送信時にhtmlタグを除外するなにかをしているのでしょうか?
    想定としては例えば<span></span>を送ると不具合が起きそうなパターンとしては
    1.空文字としては判定されないがタグ出力時にhtmlタグのみなので空文字のように見える。
    2.空文字としては判定されず、登録または出力時にエスケープされてHTMLタグがそのまま出力される(ある意味正常)
    を予想していたのですが。

    キャンセル

  • 2020/07/06 18:19

    ご返信ありがとうございます。
    >だとするとPOST送信時にhtmlタグを除外するなにかをしているのでしょうか?
    こちらですが、POSTを送信する際のform部分のhtmlコードは質問に記載させて頂いた部分のみになります。
    php側でも特段htmlタグを除去する処理は行なっていないのですが、もしかしたら、「array_filter」関数の挙動の可能性とかになってくるのでしょうかね...?

    キャンセル

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

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

関連した質問

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