アプリ版:「スタンプのみでお礼する」機能のリリースについて

拡張子 .html 以外のファイルかつ、
先頭がドット 、 base 、 index を除くものを式で表したいのですが、
教えて で、教えて頂いたものだと、

// 指定ディレクトリ内のリストを取得
$dir = scandir( '/templates/' );

/*
.DS_Store
.html
footer.html
head.html
header.html
main.html
base.html
index.html
*/

foreach ( $dir as $finfo )
{
// HTML ファイル以外及び、 base.html, index.html を除く
if ( !preg_match( '/^(base|index)\.html$/', $finfo ) ) {
echo $finfo;
}
}

HTML ファイル以外及び、 base.html, index.html を除くものを正規式で表したいのですが、
教えて で、教えて頂いたものだと以下のようになりました。
拡張子が先頭にあるものと、何故か base.html と 式には html が書かれているのに
.html 無しが出ています。

.DS_Store
.html
footer.html
head.html
header.html
main.html
base.html

そこで、試行錯誤し、!preg_match を preg_match にし、否定形の式を考えました。

if ( preg_match( '/^(?!(\.|base|index))\.html/', $finfo ) ) {


結果は以下でした。
base.html

「Why??」です。。全然、否定されてないっす。

どうすれば良いのか、教えていただければと思います。お願いします。


base.html と index.html のみなので、if 文だけでもとか、
.DS_Store は消去でというのはありますが、式の知識を増やしたいです。

質問者からの補足コメント

  • みなさん、ご回答大変有難う御座います。

    本日は休日で、買い物以外は家で自粛って感じなので、
    ロジックを記載頂いたものは動作させてみます。

      補足日時:2020/08/22 10:08

A 回答 (3件)

^(?!(\.|index|base)).*\.html$



○ footer.html
○ head.html
○ header.html
○ main.html
× .DS_Store
× .html
× base.html
× index.html
× index.hoge.html
× base.hoge.html
    • good
    • 0
この回答へのお礼

ご回答有難う御座います。

お礼日時:2020/08/22 10:09

base.html がマッチしないのは、目視ではわかり難い何かがあるからでしょう。



ファイル名の前後にスペースやタブなどの不可視文字が付いているとか、全額文字になっているなど。

下記で出力して確かめるとよいです。

var_dump($dir);
    • good
    • 0
この回答へのお礼

ご回答有難う御座います。

お礼日時:2020/08/22 10:09

$dir=array_filter($dir,function($x){


return !preg_match("/^(\\.|(base|index)\\.html$)/",$x);
});
print_r($dir);
    • good
    • 1
この回答へのお礼

ご回答有難う御座います。

お礼日時:2020/08/22 10:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!