欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

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() 函数源码分析