回答編集履歴

5

\*ACCEPTのほうに漏れがあったので406を追加して改善

2016/10/05 08:53

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -46,6 +46,10 @@
46
46
 
47
47
  <span class="num">78</span>
48
48
 
49
+
50
+
51
+ <span class="code">406</span>
52
+
49
53
  ';
50
54
 
51
55
 
@@ -76,7 +80,7 @@
76
80
 
77
81
 
78
82
 
79
- $codes = [401, 402, 403, 404, 405];
83
+ $codes = [401, 402, 403, 404, 405, 406];
80
84
 
81
85
 
82
86
 
@@ -110,6 +114,10 @@
110
114
 
111
115
  string(2) "78"
112
116
 
117
+ [406]=>
118
+
119
+ NULL
120
+
113
121
  }
114
122
 
115
123
 
@@ -120,7 +128,7 @@
120
128
 
121
129
 
122
130
 
123
- どうせなら (404以外) 結果を一気に取ってしまいましょうか.少し`(*SKIP)(*FAIL)`の部分を書き換えて,先読みを併用してみます.これが無いと405がマッチしなくなってしまいます.
131
+ どうせなら (404, 406以外) 結果を一気に取ってしまいましょうか.少し`(*SKIP)(*FAIL)`の部分を書き換えて,先読みを併用してみます.これが無いと405がマッチしなくなってしまいます.
124
132
 
125
133
 
126
134
 
@@ -158,6 +166,10 @@
158
166
 
159
167
  <span class="num">78</span>
160
168
 
169
+
170
+
171
+ <span class="code">406</span>
172
+
161
173
  ';
162
174
 
163
175
 
@@ -228,7 +240,7 @@
228
240
 
229
241
 
230
242
 
231
- もっと欲張りな「404に対応する値は空文字列として含めてしまって,結果を全部一気に欲しい」という要望にもお答えできます. `(*FAIL)`は強制的に失敗させるものでしたが,`(*ACCEPT)`は強制的に成功させます.マッチした文字列が何も無い状態で成功させると,その部分は空文字列として結果に含まれます.
243
+ もっと欲張りな「404, 406に対応する値は空文字列として含めてしまって,結果を全部一気に欲しい」という要望にもお答えできます. `(*FAIL)`は強制的に失敗させるものでしたが,`(*ACCEPT)`は強制的に成功させます.マッチした文字列が何も無い状態で成功させると,その部分は空文字列として結果に含まれます.また,406のようにnumを持たないcodeが末尾にきたときのために,`\z`による判定を追加しています.
232
244
 
233
245
 
234
246
 
@@ -266,6 +278,10 @@
266
278
 
267
279
  <span class="num">78</span>
268
280
 
281
+
282
+
283
+ <span class="code">406</span>
284
+
269
285
  ';
270
286
 
271
287
 
@@ -278,7 +294,7 @@
278
294
 
279
295
  (?:
280
296
 
281
- (?=<span[ ]class="code">)(*SKIP)(*ACCEPT)
297
+ (?=\z|<span[ ]class="code">)(*SKIP)(*ACCEPT)
282
298
 
283
299
  |
284
300
 
@@ -330,6 +346,10 @@
330
346
 
331
347
  string(2) "78"
332
348
 
349
+ [406]=>
350
+
351
+ string(0) ""
352
+
333
353
  }
334
354
 
335
355
 

4

追記

2016/10/05 08:53

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -120,7 +120,7 @@
120
120
 
121
121
 
122
122
 
123
- どうせなら (404以外) 全部一気に取ってしまいましょうか.少し`(*SKIP)(*FAIL)`の部分を書き換えて,先読みを併用してみます.これが無いと405がマッチしなくなってしまいます.
123
+ どうせなら (404以外) 結果を一気に取ってしまいましょうか.少し`(*SKIP)(*FAIL)`の部分を書き換えて,先読みを併用してみます.これが無いと405がマッチしなくなってしまいます.
124
124
 
125
125
 
126
126
 
@@ -228,7 +228,7 @@
228
228
 
229
229
 
230
230
 
231
- もっと欲張りな「404に対応する値は空文字列として全部一気に欲しい」という要望にもお答えできます. `(*FAIL)`は強制的に失敗させるものでしたが,`(*ACCEPT)`は強制的に成功させます.マッチした文字列が何も無い状態で成功させると,その部分は空文字列として結果に含まれます.
231
+ もっと欲張りな「404に対応する値は空文字列として含めてしまって,結果を全部一気に欲しい」という要望にもお答えできます. `(*FAIL)`は強制的に失敗させるものでしたが,`(*ACCEPT)`は強制的に成功させます.マッチした文字列が何も無い状態で成功させると,その部分は空文字列として結果に含まれます.
232
232
 
233
233
 
234
234
 

3

ACCPETも入れてみた

2016/10/05 08:16

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -228,4 +228,114 @@
228
228
 
229
229
 
230
230
 
231
-
231
+ もっと欲張りな「404に対応する値は空文字列として全部一気に欲しい」という要望にもお答えできます. `(*FAIL)`は強制的に失敗させるものでしたが,`(*ACCEPT)`は強制的に成功させます.マッチした文字列が何も無い状態で成功させると,その部分は空文字列として結果に含まれます.
232
+
233
+
234
+
235
+ ```php
236
+
237
+ <?php
238
+
239
+
240
+
241
+ $text = '
242
+
243
+ <span class="code">401</span>
244
+
245
+ <span class="num">25</span>
246
+
247
+
248
+
249
+ <span class="code">402</span>
250
+
251
+ <span class="num">3</span>
252
+
253
+
254
+
255
+ <span class="code">403</span>
256
+
257
+ <span class="num">126</span>
258
+
259
+
260
+
261
+ <span class="code">404</span>
262
+
263
+
264
+
265
+ <span class="code">405</span>
266
+
267
+ <span class="num">78</span>
268
+
269
+ ';
270
+
271
+
272
+
273
+ $pattern = '@
274
+
275
+ <span[ ]class="code">(.*?)</span>
276
+
277
+ .*?
278
+
279
+ (?:
280
+
281
+ (?=<span[ ]class="code">)(*SKIP)(*ACCEPT)
282
+
283
+ |
284
+
285
+ <span[ ]class="num">(.*?)</span>
286
+
287
+ )
288
+
289
+ @xs';
290
+
291
+
292
+
293
+ $results =
294
+
295
+ preg_match_all($pattern, $text, $m)
296
+
297
+ ? array_combine($m[1], $m[2])
298
+
299
+ : [];
300
+
301
+
302
+
303
+ var_dump($results);
304
+
305
+
306
+
307
+ /*
308
+
309
+
310
+
311
+ array(5) {
312
+
313
+ [401]=>
314
+
315
+ string(2) "25"
316
+
317
+ [402]=>
318
+
319
+ string(1) "3"
320
+
321
+ [403]=>
322
+
323
+ string(3) "126"
324
+
325
+ [404]=>
326
+
327
+ string(0) ""
328
+
329
+ [405]=>
330
+
331
+ string(2) "78"
332
+
333
+ }
334
+
335
+
336
+
337
+ */
338
+
339
+ ```
340
+
341
+

2

intキャストをやめた

2016/10/05 08:15

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -54,7 +54,7 @@
54
54
 
55
55
  $pattern = '@
56
56
 
57
- <span[ ]class="code">' . (int)$code . '</span>
57
+ <span[ ]class="code">' . $code . '</span>
58
58
 
59
59
  .*?
60
60
 
@@ -70,7 +70,7 @@
70
70
 
71
71
  @xs';
72
72
 
73
- return preg_match($pattern, $text, $m) ? (int)$m[1] : null;
73
+ return preg_match($pattern, $text, $m) ? $m[1] : null;
74
74
 
75
75
  };
76
76
 
@@ -92,15 +92,15 @@
92
92
 
93
93
  [401]=>
94
94
 
95
- int(25)
95
+ string(2) "25"
96
96
 
97
97
  [402]=>
98
98
 
99
- int(3)
99
+ string(1) "3"
100
100
 
101
101
  [403]=>
102
102
 
103
- int(126)
103
+ string(3) "126"
104
104
 
105
105
  [404]=>
106
106
 
@@ -108,7 +108,7 @@
108
108
 
109
109
  [405]=>
110
110
 
111
- int(78)
111
+ string(2) "78"
112
112
 
113
113
  }
114
114
 

1

追記

2016/10/05 08:09

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -117,3 +117,115 @@
117
117
  */
118
118
 
119
119
  ```
120
+
121
+
122
+
123
+ どうせなら (404以外) 全部一気に取ってしまいましょうか.少し`(*SKIP)(*FAIL)`の部分を書き換えて,先読みを併用してみます.これが無いと405がマッチしなくなってしまいます.
124
+
125
+
126
+
127
+ ```php
128
+
129
+ <?php
130
+
131
+
132
+
133
+ $text = '
134
+
135
+ <span class="code">401</span>
136
+
137
+ <span class="num">25</span>
138
+
139
+
140
+
141
+ <span class="code">402</span>
142
+
143
+ <span class="num">3</span>
144
+
145
+
146
+
147
+ <span class="code">403</span>
148
+
149
+ <span class="num">126</span>
150
+
151
+
152
+
153
+ <span class="code">404</span>
154
+
155
+
156
+
157
+ <span class="code">405</span>
158
+
159
+ <span class="num">78</span>
160
+
161
+ ';
162
+
163
+
164
+
165
+ $pattern = '@
166
+
167
+ <span[ ]class="code">(.*?)</span>
168
+
169
+ .*?
170
+
171
+ (?:
172
+
173
+ (?=<span[ ]class="code">)(*SKIP)(*FAIL)
174
+
175
+ |
176
+
177
+ <span[ ]class="num">(.*?)</span>
178
+
179
+ )
180
+
181
+ @xs';
182
+
183
+
184
+
185
+ $results =
186
+
187
+ preg_match_all($pattern, $text, $m)
188
+
189
+ ? array_combine($m[1], $m[2])
190
+
191
+ : [];
192
+
193
+
194
+
195
+ var_dump($results);
196
+
197
+
198
+
199
+ /*
200
+
201
+
202
+
203
+ array(4) {
204
+
205
+ [401]=>
206
+
207
+ string(2) "25"
208
+
209
+ [402]=>
210
+
211
+ string(1) "3"
212
+
213
+ [403]=>
214
+
215
+ string(3) "126"
216
+
217
+ [405]=>
218
+
219
+ string(2) "78"
220
+
221
+ }
222
+
223
+
224
+
225
+ */
226
+
227
+ ```
228
+
229
+
230
+
231
+