下記コードに並ぶ$url
のうち、最後の2つができなくて行き詰っています。
大まかにはhttps://example.com/●●▲▲
のような$url
が与えられ、
➀●●
がus
だと不一致としたい
➁▲▲
がq=
だと不一致としたい
という条件で、だいたいうまくできています。
しかしここに
➂●●
も▲▲
もないときは一致としたい
という条件を追加することができません。
それが下記の最後の2つの$url
で、→ できない
とある部分です。
php
1/* 2不一致にしたい$url 3************************/ 4$url = "https://example.com/us?q=aaa"; //「us」も「?q=」もあるので、不一致 5$url = "https://example.com/jp?q=aaa"; //「q=」があるので、不一致 6$url = "https://example.com/us?qx=aaa"; //「us」があるので、不一致 7$url = "https://example.com/us"; //「us」があるので、不一致 8$url = "https://example.com/?q=aaa"; //「q=」があるので、不一致 9$url = "https://example.com/?sort=date&q=aaa"; //「q=」があるので、不一致 10 11/* 12一致にしたい$url 13************************/ 14$url = "https://example.com/jp?qx=aaa"; //「us」も「q=」もないので、一致 15$url = "https://example.com/jp"; //「us」も「q=」もないので、一致 → できない 16$url = "https://example.com/"; //「us」も「q=」もないので、一致 → できない 17 18/* 19検証を実行 20************************/ 21$pattern = '{https?://example.com/(?!us)[a-z]{2}(?!\q=)[^/]+}'; 22var_dump( is_match($url,$pattern) ); 23function is_match( $url, $pattern ){ 24 if ( preg_match( $pattern, $url , $match ) ) { 25 return '一致'; 26 } else { 27 return '不一致'; 28 } 29}
日本語でいうと、「『否定部分(●●
や▲▲
)』それ自体が、あるかないかわからない」ということになるのかと思います。
そのため、
➀後ろにはてなマークをつけて(否定部分[文字列])?
という表現を試したのですが実現できず、
➁あと否定部分([文字列])?
という風に文字列の部分だけをあるかないかわからないと表現したのも実現できず、
➂さらに否定部分|
という風に、否定部分または何もない
という表現も試したのですがやはり実現できず、このようなときはどうしたらよろしいでしょうか。
php
1// 上記コード 2$pattern = '{https?://example.com/(?!us)[a-z]{2}(?!?q=)[^/]+}'; 3 4// ➀後ろにはてなマークをつける表現 → 実現できず 5$pattern = '{https?://example.com/((?!us)[a-z]{2})?((?!?q=)[^/]+)?}'; 6 7// ➁否定部分の文字列の後ろにはてなマークをつける表現 → 実現できず 8$pattern = '{https?://example.com/(?!us)([a-z]{2})?(?!\q=)([^/]+)?}'; 9 10// ➂否定部分または何もないという表現 → 実現できず 11$pattern = '{https?://example.com/((?!us)[a-z]{2}|)((?!\q=)[^/]+|)}'; 12
回答2件
あなたの回答
tips
プレビュー