PHP explode() 函数源码分析
程序员文章站
2022-03-20 23:37:58
...
在PHP网站开发中,我们经常需要把一个字符串分割成数组,这时候我们经常会使用 PHP explode() 函数来帮我们实现。这篇文章我们主要来学学 explode() 函数是怎么工作的。 文件1:ext/standard/string.c (explode的源代码) PHP_FUNCTION ( explode ) { char
在PHP网站开发中,我们经常需要把一个字符串分割成数组,这时候我们经常会使用 PHP explode() 函数来帮我们实现。这篇文章我们主要来学学 explode() 函数是怎么工作的。
文件1:ext/standard/string.c (explode的源代码)
PHP_FUNCTION(explode){char*str,*delim;int str_len =0, delim_len =0;long limit = LONG_MAX;/* No limit */ zval zdelim, zstr;if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"ss|l",&delim,&delim_len,&str,&str_len,&limit)== FAILURE){return;}if(delim_len ==0){ php_error_docref(NULL TSRMLS_CC, E_WARNING,"Empty delimiter"); RETURN_FALSE;}// 这里会开辟一个数组,用来存放分割后的数据 array_init(return_value);// 因为这个,我们用explode('|', '');成为了合法的if(str_len ==0){if(limit >=0){ add_next_index_stringl(return_value,"",sizeof("")-1,1);}return;}// 下面这两个是将原字串和分割符都构建成_zval_struct 结构,// ZVAL_STRINGL会分配空间~~源代码随后贴出 ZVAL_STRINGL(&zstr, str, str_len,0); ZVAL_STRINGL(&zdelim, delim, delim_len,0);// limit值是explode中允许传递的explode的第三个参数,它允许正负if(limit >1){ php_explode(&zdelim,&zstr, return_value, limit);}elseif(limit 0){ php_explode_negative_limit(&zdelim,&zstr, return_value, limit);}else{ add_index_stringl(return_value,0, str, str_len,1);}}
文章摘自 PHP explode() 函数源码分析