質問編集履歴

1

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

2020/07/30 22:22

投稿

gongitune3
gongitune3

スコア12

test CHANGED
File without changes
test CHANGED
@@ -29,3 +29,123 @@
29
29
  }
30
30
 
31
31
  ```
32
+
33
+ ###m.ts10806様へ
34
+
35
+ ご指摘の点、補足させていただきます。具体的な事例ですが以下の流れを汲んでおります。
36
+
37
+
38
+
39
+ 3行目のコメントアウトに記載ございます通り、このURLパターンは`item`に属するはずなのに`user`に属すという結果になってしまうのです。
40
+
41
+
42
+
43
+ そのため14行目のパターンで、`widget`と`iframe`を除外する、という正規表現を目論みました。
44
+
45
+ それができれば3行目のパターンは`item`に属してくれるという考えです。
46
+
47
+
48
+
49
+ このような経緯から、「単語の除外」について正規表現で質問させていただいたという次第です。
50
+
51
+
52
+
53
+ ```php
54
+
55
+ // 次のようなURLが $pattern_wrapper のどのパターンに属すか確認するのが目的です
56
+
57
+ $url = "https://www.example.com/taro/aaa-bbb-ccc/"; // こういうURLパターンが複数あります
58
+
59
+ $url = "https://www.example.com/widget/iframe/taro/"; // このURLパターンから $result['kind']='item'; を得たのに、$result['kind']='user' を得てしまいます
60
+
61
+
62
+
63
+ // URLの想定されるパターンを指定します
64
+
65
+ $pattern_wrapper = [
66
+
67
+ 'example' => [
68
+
69
+ 'service' => [
70
+
71
+ '{\Ahttps?://(www.)?example.com/.+}',
72
+
73
+ ],
74
+
75
+ 'item' => [
76
+
77
+ '{\Ahttps?://(www.)?example.com/widget/iframe/(?P<name>[^/]+)}',
78
+
79
+ ],
80
+
81
+ 'user' => [
82
+
83
+ '{\Ahttps?://(www.)?example.com/(?P<name>[^/]+)/(?P<id>[^/]+)}',
84
+
85
+ ],
86
+
87
+ ],
88
+
89
+ 'example2' => [
90
+
91
+ 'service' => [
92
+
93
+ '{\Ahttps?://example2.net/.+}',
94
+
95
+ ],
96
+
97
+ 'drink' => [
98
+
99
+ '{\Ahttps?://example2.net/drinks/(?P<id>[0-9]+)\z}',
100
+
101
+ ],
102
+
103
+
104
+
105
+ ],
106
+
107
+ ];
108
+
109
+
110
+
111
+ // 結果として次の値を取得します
112
+
113
+ $result = ['service'=>null,'kind'=>null,'id'=>null,'name'=>null];
114
+
115
+
116
+
117
+ // $url がどのパターンに一致するか確認します
118
+
119
+ foreach ( $pattern_wrapper as $service => $kind_depth ) {
120
+
121
+ foreach ( $kind_depth as $kind => $pattern_arr ) {
122
+
123
+ foreach ( $pattern_arr as $pattern ) {
124
+
125
+ if ( preg_match( $pattern, $url, $matches ) ){
126
+
127
+ if ( $kind === 'service' ) {
128
+
129
+ $result['service'] = $service;
130
+
131
+ } else {
132
+
133
+ $result['id'] = $matches['id'] ?? '';
134
+
135
+ $result['name'] = $matches['name'] ?? '';
136
+
137
+ $result['kind'] = $kind;
138
+
139
+ }
140
+
141
+ }
142
+
143
+ }
144
+
145
+ }
146
+
147
+ }
148
+
149
+ var_dump($result);
150
+
151
+ ```