@@ -211,22 +211,24 @@ PHP_FUNCTION(ltrim)
211
211
212
212
PHPAPI void php_explode (pval * delim , pval * str , pval * return_value )
213
213
{
214
- char * work_str , * p1 , * p2 ;
214
+ char * p1 , * p2 , * endp ;
215
215
int i = 0 ;
216
216
217
- work_str = p1 = estrndup (str -> value .str .val ,str -> value .str .len );
218
- p2 = strstr (p1 , delim -> value .str .val );
217
+ endp = str -> value .str .val + str -> value .str .len ;
218
+
219
+ p1 = str -> value .str .val ;
220
+ p2 = php_memnstr (str -> value .str .val , delim -> value .str .val , delim -> value .str .len , endp );
221
+
219
222
if (p2 == NULL ) {
220
- add_index_string (return_value , i ++ , p1 , 1 );
223
+ add_index_stringl (return_value , i ++ , p1 , str -> value . str . len , 1 );
221
224
} else do {
222
- p2 [0 ] = 0 ;
223
- add_index_string (return_value , i ++ , p1 , 1 );
225
+ add_index_stringl (return_value , i ++ , p1 , p2 - p1 , 1 );
224
226
p1 = p2 + delim -> value .str .len ;
225
- } while ((p2 = strstr (p1 , delim -> value .str .val )) && p2 != work_str );
226
- if (p1 != work_str ) {
227
- add_index_string (return_value , i ++ , p1 , 1 );
227
+ } while (p2 = php_memnstr (p1 , delim -> value .str .val , delim -> value .str .len , endp ));
228
+
229
+ if (p1 <= endp ) {
230
+ add_index_stringl (return_value , i ++ , p1 , endp - p1 , 1 );
228
231
}
229
- efree (work_str );
230
232
}
231
233
232
234
/* {{{ proto array explode(string separator, string str)
@@ -238,17 +240,19 @@ PHP_FUNCTION(explode)
238
240
if (ARG_COUNT (ht ) != 2 || getParametersEx (2 , & delim , & str ) == FAILURE ) {
239
241
WRONG_PARAM_COUNT ;
240
242
}
243
+
241
244
convert_to_string_ex (str );
242
245
convert_to_string_ex (delim );
243
246
244
- if (strlen ((* delim )-> value .str .val )== 0 ) {
245
- /* the delimiter must be a valid C string that's at least 1 character long */
247
+ if (! (* delim )-> value .str .len ) {
246
248
php_error (E_WARNING ,"Empty delimiter" );
247
249
RETURN_FALSE ;
248
250
}
251
+
249
252
if (array_init (return_value ) == FAILURE ) {
250
- return ;
253
+ RETURN_FALSE ;
251
254
}
255
+
252
256
php_explode (* delim , * str , return_value );
253
257
}
254
258
/* }}} */
0 commit comments