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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1197閲覧

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

study_111

総合スコア82

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/07/06 08:13

前提・実現したいこと

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

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

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です

html

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

以下は、upload.phpです

php

1if(isset($_POST['tag'])){ 2 $tag = $_POST['tag']; 3 4 if (mb_strlen($tag, 'UTF-8') > 500){ 5 $err_msg[] = 'タグに登録出来る文字数は500文字以内です'; 6 }else{ 7 $tag_array = explode(',',$tag); 8 $tag_array = array_filter($tag_array,'strlen'); 9 10 // var_dump($tag_array[3]); 11 $tag_array = array_unique($tag_array); 12 var_dump($tag_array); 13 } 14 15}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

投稿2020/07/06 08:41

gogoweb_ikeda

総合スコア1426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

study_111

2020/07/06 08:47

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

2020/07/06 08:59

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

2020/07/06 09:19

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

0

ベストアンサー

PHP

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

投稿2020/07/06 08:39

yambejp

総合スコア114837

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

study_111

2020/07/06 08:50

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

2020/07/06 08:59

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

2020/07/06 09:09

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

0

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

php

1$a = "test, te st2, test3 "; 2var_dump(explode(",", preg_replace("/\s+/","",$a) )); // 空白文字のみ 3/* 4array(3) { 5 [0]=> 6 string(4) "test" 7 [1]=> 8 string(5) "test2" 9 [2]=> 10 string(5) "test3" 11} 12*/ 13 14var_dump( preg_grep("/^[^\s]*$/",explode(",",$a)) ); // 空文字を含む要素 15/* 16array(1) { 17 [0]=> 18 string(4) "test" 19} 20*/ 21

投稿2020/07/06 08:36

yuuyu

総合スコア1139

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問