質問するログイン新規登録

質問編集履歴

1

m.ts10806様へご指摘の点を加筆

2020/07/30 22:22

投稿

gongitune3
gongitune3

スコア12

title CHANGED
File without changes
body CHANGED
@@ -13,4 +13,64 @@
13
13
  if ( preg_match( '{\Ahello(^world).+\z}', $str ) ) { // "world" という単語だけを否定したい
14
14
  echo '一致';
15
15
  }
16
+ ```
17
+ ###m.ts10806様へ
18
+ ご指摘の点、補足させていただきます。具体的な事例ですが以下の流れを汲んでおります。
19
+
20
+ 3行目のコメントアウトに記載ございます通り、このURLパターンは`item`に属するはずなのに`user`に属すという結果になってしまうのです。
21
+
22
+ そのため14行目のパターンで、`widget`と`iframe`を除外する、という正規表現を目論みました。
23
+ それができれば3行目のパターンは`item`に属してくれるという考えです。
24
+
25
+ このような経緯から、「単語の除外」について正規表現で質問させていただいたという次第です。
26
+
27
+ ```php
28
+ // 次のようなURLが $pattern_wrapper のどのパターンに属すか確認するのが目的です
29
+ $url = "https://www.example.com/taro/aaa-bbb-ccc/"; // こういうURLパターンが複数あります
30
+ $url = "https://www.example.com/widget/iframe/taro/"; // このURLパターンから $result['kind']='item'; を得たのに、$result['kind']='user' を得てしまいます
31
+
32
+ // URLの想定されるパターンを指定します
33
+ $pattern_wrapper = [
34
+ 'example' => [
35
+ 'service' => [
36
+ '{\Ahttps?://(www.)?example.com/.+}',
37
+ ],
38
+ 'item' => [
39
+ '{\Ahttps?://(www.)?example.com/widget/iframe/(?P<name>[^/]+)}',
40
+ ],
41
+ 'user' => [
42
+ '{\Ahttps?://(www.)?example.com/(?P<name>[^/]+)/(?P<id>[^/]+)}',
43
+ ],
44
+ ],
45
+ 'example2' => [
46
+ 'service' => [
47
+ '{\Ahttps?://example2.net/.+}',
48
+ ],
49
+ 'drink' => [
50
+ '{\Ahttps?://example2.net/drinks/(?P<id>[0-9]+)\z}',
51
+ ],
52
+
53
+ ],
54
+ ];
55
+
56
+ // 結果として次の値を取得します
57
+ $result = ['service'=>null,'kind'=>null,'id'=>null,'name'=>null];
58
+
59
+ // $url がどのパターンに一致するか確認します
60
+ foreach ( $pattern_wrapper as $service => $kind_depth ) {
61
+ foreach ( $kind_depth as $kind => $pattern_arr ) {
62
+ foreach ( $pattern_arr as $pattern ) {
63
+ if ( preg_match( $pattern, $url, $matches ) ){
64
+ if ( $kind === 'service' ) {
65
+ $result['service'] = $service;
66
+ } else {
67
+ $result['id'] = $matches['id'] ?? '';
68
+ $result['name'] = $matches['name'] ?? '';
69
+ $result['kind'] = $kind;
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
75
+ var_dump($result);
16
76
  ```