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

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

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

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

Q&A

解決済

3回答

605閲覧

PHPでの記号付き配列検索

m2677024688

総合スコア5

PHP

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

0グッド

0クリップ

投稿2019/08/28 04:01

編集2019/08/28 05:18

前提・実現したいこと

配列から一致するものを取得したいです。

問題内容

検索する文字に + が入っている場合に検索が正常に機能しません。
+ が入っている状態で検索できるようにしたいです。

該当のソースコード

#NG パターン (sample_+_title__1_.jpg)

php

1<?php 2 $array = [ 3 1 => "https://sample.com/image_name/1/sample_+_title__1_.jpg", 4 2 => "https://sample.com/image_name/2/sample_+_title__2_.jpg", 5 3 => "https://sample.com/image_name/3/sample_+_title__3_.jpg", 6 ]; 7 8 $pattern = "{image_name/1/sample_+_title__1_.jpg}"; 9 $file = preg_grep($pattern , $array); 10 print_r($file); 11 12//結果 13Array() 14

OK パターン (sample__title__1_.jpg)

php

1<?php 2 $array = [ 3 1 => "https://sample.com/image_name/1/sample__title__1_.jpg", 4 2 => "https://sample.com/image_name/2/sample_+_title__2_.jpg", 5 3 => "https://sample.com/image_name/3/sample_+_title__3_.jpg", 6 ]; 7 8 $pattern = "{image_name/1/sample_+_title__1_.jpg}"; 9 $file = preg_grep($pattern , $array); 10 print_r($file); 11 12//結果 13Array 14( 15 [1] => https://sample.com/image_name/1/sample__title__1_.jpg 16) 17

試したこと

$file = preg_grep('/'.$pattern.'/' , $array); エラーメッセージ "preg_grep(): Unknown modifier '1'",
$file = array_search($pattern , $array); 完全一致の場合のみ問題ありませんでしたが一部が一致で取得したいです。

検索できずで困っております、ご教授お願いします。

解決ソースコート

$array = [ 1 => "https://sample.com/image_name/1/sample_+_title__1_.jpg", 2 => "https://sample.com/image_name/2/sample_+_title__2_.jpg", 3 => "https://sample.com/image_name/3/sample_+_title__3_.jpg", ]; $pattern = "image_name/1/sample_+_title__1_.jpg"; $result = "/".preg_quote($pattern,"/")."/"; $file = preg_grep($result , $array); dd($file); ``` # 上記で違うところあればご教授ください。

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

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

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

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

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

m.ts10806

2019/08/28 04:08

Laravelが関係ありそうな箇所がないのでタグは「PHP」だけにしてもらっても良いですか?
guest

回答3

0

正規表現において+は意味を持ちます。

正規表現

例えば + は「1文字以上の」を意味します。

正規表現で意味を持つ記号を「文字列として扱いたい」のであればエスケープシーケンスを入れてください。

php

1<?php 2$array = [ 3 1 => "https://sample.com/image_name/1/sample_+_title__1_.jpg", 4 2 => "https://sample.com/image_name/2/sample_+_title__2_.jpg", 5 3 => "https://sample.com/image_name/3/sample_+_title__3_.jpg", 6]; 7 8$pattern = "{image_name/1/sample_+_title__1_.jpg}"; 9$file = preg_grep($pattern , $array); 10print_r($file); 11 12/** 13Array 14( 15 [1] => https://sample.com/image_name/1/sample_+_title__1_.jpg 16) 17**/ 18

投稿2019/08/28 04:11

編集2019/08/28 04:16
m.ts10806

総合スコア80850

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

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

m2677024688

2019/08/28 04:26

おっしゃるっ通りでデータが既にあるので困っておりました。
m.ts10806

2019/08/28 04:28

>データが既にあるので 本件と何の関係があるのか分かりません・・
m.ts10806

2019/08/28 04:40

&#039;をシングルクォートに変えて実行してみてください。 URLとしてそのままは使えない文字列という意味です。
m2677024688

2019/08/28 04:44

https%3A%2F%2Fsample.com%2Fimage_name%2F1%2Fsample_%2B_title__1_.jpg 上記のようになりましたがどういうことでしょうか?
m2677024688

2019/08/28 04:47

解決ソースコートを本文に追記いたしました。 「.」もエスケープするひつようがあるのでしょうか?
m.ts10806

2019/08/28 06:12

> 「.」もエスケープするひつようがあるのでしょうか? 回答に「正規表現で意味を持つ記号を「文字列として扱いたい」のであれば」と書きました。 > 上記のようになりましたがどういうことでしょうか? もしHTMLで画像表示とかしたいならそのままは使えないかもしれない(ブラウザに寄るかもしれない)ということですね。
guest

0

ベストアンサー

「.」もエスケープしないとだめ

SQL

1$array = [ 2 1 => "https://sample.com/image_name/1/sample_+_title__1_.jpg", 3 2 => "https://sample.com/image_name/2/sample_+_title__2_.jpg", 4 3 => "https://sample.com/image_name/3/sample_+_title__3_.jpg", 5 ]; 6$pattern = "/".preg_quote("image_name/1/sample_+_title__1_.jpg","/")."/"; 7print_r($pattern); 8$file = preg_grep($pattern , $array); 9print_r($file);

※preg_quoteの第2引数にはデリミタとして使用したい任意の文字をいれます

投稿2019/08/28 04:29

yambejp

総合スコア114839

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

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

m2677024688

2019/08/28 04:46

回答ありがとうございます。 $pattern = "{image_name/1/sample_+_title__1_.jpg}"; $result = str_replace('+', '+', $pattern); するだけでは不十分ということでしょうか?
m2677024688

2019/08/28 04:55

なるほどですね。 ありがとうございます。 現状そのパターンがないようなので問題なさそうです。
yambejp

2019/08/28 04:59 編集

> 現状そのパターンがないようなので問題なさそうです。 そういう問題ではないです。 データがあるかないかの判定処理に 「パターンがない」というのは合理的な判断ではありません 回答のとおり必ずpreg_quoteしてください
m2677024688

2019/08/28 05:08 編集

$array = [ 1 => "https://sample.com/image_name/1/sample_+_title__1_.jpg", 2 => "https://sample.com/image_name/2/sample_+_title__2_.jpg", 3 => "https://sample.com/image_name/3/sample_+_title__3_.jpg", ]; $file_name = "{image_name/1/sample_+_title__1_.jpg}"; $result = str_replace('+', '+', $file_name); $pattern = "/".preg_quote($result,"/")."/"; $file = preg_grep($pattern , $array); dd($file); 上記のソースにしたところ検索で引っかからなくなりました。 何か間違っているのでしょうか?
m2677024688

2019/08/28 05:08

第二引数を`.`にした場合 "preg_grep(): Unknown modifier '1'", とでました。 ご教授ください。
m2677024688

2019/08/28 05:17

理解できました。 preg_quoteは第2引数以外を自動でエスケープしてくれるということですね。 そのため $array = [ 1 => "https://sample.com/image_name/1/sample_+_title__1_.jpg", 2 => "https://sample.com/image_name/2/sample_+_title__2_.jpg", 3 => "https://sample.com/image_name/3/sample_+_title__3_.jpg", ]; $pattern = "image_name/1/sample_+_title__1_.jpg"; $result = "/".preg_quote($pattern,"/")."/"; $file = preg_grep($result , $array); dd($file); で問題ないということですね?
m2677024688

2019/08/28 05:19

ベストアンサーにさせていただきました。 感謝いたします。
guest

0

$pattern の内容を適切にエスケープしてください。

投稿2019/08/28 04:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m2677024688

2019/08/28 04:10

どういったエスケープが正しいのでしょうか? よろしくお願いします。 できれば具体的な修正いただきたいです。
m2677024688

2019/08/28 04:11

回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問