- ベストアンサー
正規表現について
正規表現について教えてください。 URLの指定をしたいのですが、その中からindex.htmlのみを除外したいのです。 例えば、 aaa.html aa1.html はあてはまるけれど、 index.html だけは除きたい、という場合です。 現在、 /([A-Za-z0-9]+)\.htm$ このように指定しており、これだと、index.htmlにもあてはまってしまいます。 この場合、どう指定すればよいのでしょうか? よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#1の方の回答にあるように、二段階でチェックするのが無難です。 “index”でない文字列にマッチする正規表現て例えばこんなですよ? (?:(?:(?:(?:(?:(?:(?:(?:[^i]*)*(?:i+[^n][^i]*)*)*)*(?:i+[^d][^i]*)*)*)*(?:i+[^e][^i]*)*)*)*(?:i+[^x][^i]*)*)* まあ先読みを使うとか他にも手はありますけど。
その他の回答 (4)
- _chihiro_
- ベストアンサー率63% (26/41)
> sakusaker7さん なるほど、僕の理解不足でした。 sakusaker7さんのおっしゃるとおり、先ほどの例([^index])では、indexもidexnもdexniもxdineもマッチしてしまいます。。 という事で、もっとシンプルに !preg_match('/.*\/index\.html$/', $url) で、'index.html'にマッチしない、になるのではないでしょうか? それとも、既に挙がっているように二重でチェックをするか。 sakusaker7さん、ご指摘ありがとうございました。
- sakusaker7
- ベストアンサー率62% (800/1280)
> [^(正規表現)]で(正規表現)にマッチしない、という意になります。 違います。 ブラケットの中ではカッコのペアを使ってもグループ化の役目をしません。 参考に挙げられたURLの文書にも --- 角カッコ 開き角カッコは文字クラス (character class) の開始を表し、 閉じ角カッコにより文字クラスは終了します。閉じ角カッコだけでは、 特別な意味を持ちません。閉じ角カッコを文字クラスのメンバとしたい場合は、 文字クラスの最初の文字(否定のハット記号がある場合はその直後)とするか、 バックスラッシュでエスケープする必要があります。 文字クラスは、検索対象文字列のたかだか 1 文字にマッチします。 マッチする文字は、その文字クラスによって定義された文字集合のうちの どれかです。ただし、文字クラスの最初の文字がハット記号の場合は、 マッチする文字は、その文字クラスに定義されていない文字となります。 ハット記号自体をクラスのメンバとしたい場合は、文字クラスの 最初の文字としないか、バックスラッシュでエスケープしてください。 --- ってありますよ。
- _chihiro_
- ベストアンサー率63% (26/41)
僕も正規表現かなり苦手ですが、簡単なマッチでよければ /^https?:\/\/[a-zA-Z0-9_\.\-\/\~]+[a-zA-Z0-9]+[^index]\.html$/ でいけるはず?です。(未確認) [^(正規表現)]で(正規表現)にマッチしない、という意になります。 ※上のサンプルは、だいぶ適当なのでそのまま利用するとバグが出ると思いますので注意してください。
補足
ANo.4のsakusaker7さんが言われるように、 [^index] では一致しないような気がしますが。。。
- yambejp
- ベストアンサー率51% (3827/7415)
正規表現でフィルタした後に、index.htmlのチェックをいれてみては?
補足
実は、ちょっとしたツールを使っていて、そのツールの引数として、正規表現が必要になったのです・・・。 なので、if文などで分岐させることが出来ず、困っておりました。 言葉足らずですいませんでした。。。
お礼
ご回答ありがとうございましたm(_ _)m
補足
ありがとうございます。 なるほど・・・こんなことになってしまうのですか(^_^;) ちょっと他の方法を考えた方がよいかもしれませんね。 ツールの引数として、正規表現が必要だったので、これを考えていたのですが・・・。 もっと簡単な方法があるのかな、と思っていたので、こんなことになるとは思っていませんでした(^_^;) ちょっと勉強し直します。 ありがとうございました。