正規表現で「完全一致の単語」を除外したいです。
数時間googleで検索しているのですが・・・本当に見つかりません。
正規表現 否定
という検索では「否定先読み」ばかりで「完全一致の単語」という方法が検索できませんので
正規表現 否定 -先読み
などのように先読みを検索しないなど工夫して試みているのですが、さっぱり見当たらないです。
イメージとしてはこのように「"world"以外の単語」の場合だけ一致
をechoしたいのですが。
php
1$str = "helloworlds"; // "world" ではなく "worlds" になっているので一致としたい 2if ( preg_match( '{\Ahello(^world).+\z}', $str ) ) { // "world" という単語だけを否定したい 3 echo '一致'; 4}
###m.ts10806様へ
ご指摘の点、補足させていただきます。具体的な事例ですが以下の流れを汲んでおります。
3行目のコメントアウトに記載ございます通り、このURLパターンはitem
に属するはずなのにuser
に属すという結果になってしまうのです。
そのため14行目のパターンで、widget
とiframe
を除外する、という正規表現を目論みました。
それができれば3行目のパターンはitem
に属してくれるという考えです。
このような経緯から、「単語の除外」について正規表現で質問させていただいたという次第です。
php
1// 次のようなURLが $pattern_wrapper のどのパターンに属すか確認するのが目的です 2$url = "https://www.example.com/taro/aaa-bbb-ccc/"; // こういうURLパターンが複数あります 3$url = "https://www.example.com/widget/iframe/taro/"; // このURLパターンから $result['kind']='item'; を得たのに、$result['kind']='user' を得てしまいます 4 5// URLの想定されるパターンを指定します 6$pattern_wrapper = [ 7 'example' => [ 8 'service' => [ 9 '{\Ahttps?://(www.)?example.com/.+}', 10 ], 11 'item' => [ 12 '{\Ahttps?://(www.)?example.com/widget/iframe/(?P<name>[^/]+)}', 13 ], 14 'user' => [ 15 '{\Ahttps?://(www.)?example.com/(?P<name>[^/]+)/(?P<id>[^/]+)}', 16 ], 17 ], 18 'example2' => [ 19 'service' => [ 20 '{\Ahttps?://example2.net/.+}', 21 ], 22 'drink' => [ 23 '{\Ahttps?://example2.net/drinks/(?P<id>[0-9]+)\z}', 24 ], 25 26 ], 27]; 28 29// 結果として次の値を取得します 30$result = ['service'=>null,'kind'=>null,'id'=>null,'name'=>null]; 31 32// $url がどのパターンに一致するか確認します 33foreach ( $pattern_wrapper as $service => $kind_depth ) { 34 foreach ( $kind_depth as $kind => $pattern_arr ) { 35 foreach ( $pattern_arr as $pattern ) { 36 if ( preg_match( $pattern, $url, $matches ) ){ 37 if ( $kind === 'service' ) { 38 $result['service'] = $service; 39 } else { 40 $result['id'] = $matches['id'] ?? ''; 41 $result['name'] = $matches['name'] ?? ''; 42 $result['kind'] = $kind; 43 } 44 } 45 } 46 } 47} 48var_dump($result);
回答3件
あなたの回答
tips
プレビュー