質問: "https://www.example.com/widget/iframe/?view=1&feed=/taro/aaa-bbb-ccc/"; ``` 否定の方法を検索しまして 「`(?!.*(abc|efg)).*`」が 「abcとefgではない」 を表現するものだと知りました。 そこで次のように 「`(?!.*(\/|widget))`」と書いて 「スラッシュとwidget」ではない を意図したのですが、これを➀について実行すると「おかしい」がechoされてしまいました。 ``` if ( preg_match( '{\Ahttps?:\/\/(www\.)?example\.com\/(?!.*(\/|widget)).*\/(?!.*(\/|iframe)).*}', $url ) ) { echo '➀に一致'; } elseif ( preg_match( '{\Ahttps?:\/\/(www\.)?example\.com\/widget\/iframe\/?\?[^\/]+feed=\/(?P[^\/]+)\/(?P[^\/]+)}', $url ) ) { echo '➁に一致'; } else { echo 'おかしい'; } ``` また、上記は「含まない」という表記ではないかと考えまして「一致しない」の意味をもつと思われる`^(文字列)`でも試みたのですが、こちらもうまくいきません。 ``` if ( preg_match( '{\Ahttps?:\/\/(www\.)?example\.com\/^(\/|widget).+\/^(\/|iframe).+}', $url ) ) { ```
回答: > > 「https://www.example.com/widget/iframe/というパターンではない」 > > > 「https://www.example.com/widget/iframe/というパターンにマッチするなら真」なコードを書いて 論理否定演算子を加えて結果を反転させる。