summaryrefslogtreecommitdiff
path: root/ext/standard/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/string.c')
-rw-r--r--ext/standard/string.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/ext/standard/string.c b/ext/standard/string.c
index b9c2194c76..4b2cf4dbe5 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -213,7 +213,7 @@ PHP_FUNCTION(ltrim)
}
/* }}} */
-PHPAPI void php_explode(zval *delim, zval *str, zval *return_value)
+PHPAPI void php_explode(zval *delim, zval *str, zval *return_value, int limit)
{
char *p1, *p2, *endp;
int i = 0;
@@ -229,22 +229,37 @@ PHPAPI void php_explode(zval *delim, zval *str, zval *return_value)
do {
add_index_stringl(return_value, i++, p1, p2-p1, 1);
p1 = p2 + delim->value.str.len;
+ if((limit>=0)&&(i>=limit-1))
+ break;
} while ((p2 = php_memnstr(p1, delim->value.str.val, delim->value.str.len, endp)) != NULL);
- if (p1 <= endp) {
+ if ((p1 <= endp)|| ((limit>=0)&&(i>=limit-1))){
add_index_stringl(return_value, i++, p1, endp-p1, 1);
}
}
}
-/* {{{ proto array explode(string separator, string str)
+/* {{{ proto array explode(string separator, string str [, int limit])
Split a string on string separator and return array of components */
PHP_FUNCTION(explode)
{
- zval **str, **delim;
+ zval **str, **delim, **zlimit = NULL;
+ int limit;
- if (ARG_COUNT(ht) != 2 || zend_get_parameters_ex(2, &delim, &str) == FAILURE) {
+ switch (ARG_COUNT(ht)) {
+ case 2:
+ if (zend_get_parameters_ex(2, &delim, &str) == FAILURE)
+ WRONG_PARAM_COUNT;
+ limit=-1;
+ break;
+ case 3:
+ if (zend_get_parameters_ex(3, &delim, &str, &zlimit) == FAILURE)
WRONG_PARAM_COUNT;
+ convert_to_long_ex(zlimit);
+ limit = (*zlimit)->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
}
convert_to_string_ex(str);
@@ -259,7 +274,11 @@ PHP_FUNCTION(explode)
RETURN_FALSE;
}
- php_explode(*delim, *str, return_value);
+ if((limit==0)||(limit==1)) {
+ add_index_stringl(return_value, 0, (*str)->value.str.val, (*str)->value.str.len, 1);
+ } else {
+ php_explode(*delim, *str, return_value, limit);
+ }
}
/* }}} */