Rumah > php教程 > php手册 > PHP explode() 函数源码分析

PHP explode() 函数源码分析

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2016-06-06 19:55:33
asal
1453 orang telah melayarinya

在PHP网站开发中,我们经常需要把一个字符串分割成数组,这时候我们经常会使用 PHP explode() 函数来帮我们实现。这篇文章我们主要来学学 explode() 函数是怎么工作的。 文件1:ext/standard/string.c (explode的源代码) PHP_FUNCTION ( explode ) { char

在PHP网站开发中,我们经常需要把一个字符串分割成数组,这时候我们经常会使用 PHP explode() 函数来帮我们实现。这篇文章我们主要来学学 explode() 函数是怎么工作的。

 

文件1:ext/standard/string.c (explode的源代码)

 

<span>PHP_FUNCTION</span><span>(</span><span>explode</span><span>)</span><span>{</span><span>char</span><span>*</span><span>str</span><span>,</span><span>*</span><span>delim</span><span>;</span><span>int</span><span> str_len </span><span>=</span><span>0</span><span>,</span><span> delim_len </span><span>=</span><span>0</span><span>;</span><span>long</span><span> limit </span><span>=</span><span> LONG_MAX</span><span>;</span><span>/* No limit */</span><span>
    zval zdelim</span><span>,</span><span> zstr</span><span>;</span><span>if</span><span>(</span><span>zend_parse_parameters</span><span>(</span><span>ZEND_NUM_ARGS</span><span>()</span><span> TSRMLS_CC</span><span>,</span><span>"ss|l"</span><span>,</span><span>&</span><span>delim</span><span>,</span><span>&</span><span>delim_len</span><span>,</span><span>&</span><span>str</span><span>,</span><span>&</span><span>str_len</span><span>,</span><span>&</span><span>limit</span><span>)</span><span>==</span><span> FAILURE</span><span>)</span><span>{</span><span>return</span><span>;</span><span>}</span><span>if</span><span>(</span><span>delim_len </span><span>==</span><span>0</span><span>)</span><span>{</span><span>
        php_error_docref</span><span>(</span><span>NULL TSRMLS_CC</span><span>,</span><span> E_WARNING</span><span>,</span><span>"Empty delimiter"</span><span>);</span><span>
        RETURN_FALSE</span><span>;</span><span>}</span><span>// 这里会开辟一个数组,用来存放分割后的数据</span><span>
    array_init</span><span>(</span><span>return_value</span><span>);</span><span>// 因为这个,我们用explode('|', '');成为了合法的</span><span>if</span><span>(</span><span>str_len </span><span>==</span><span>0</span><span>)</span><span>{</span><span>if</span><span>(</span><span>limit </span><span>>=</span><span>0</span><span>)</span><span>{</span><span>
            add_next_index_stringl</span><span>(</span><span>return_value</span><span>,</span><span>""</span><span>,</span><span>sizeof</span><span>(</span><span>""</span><span>)</span><span>-</span><span>1</span><span>,</span><span>1</span><span>);</span><span>}</span><span>return</span><span>;</span><span>}</span><span>// 下面这两个是将原字串和分割符都构建成_zval_struct 结构,</span><span>// ZVAL_STRINGL会分配空间~~源代码随后贴出</span><span>
    ZVAL_STRINGL</span><span>(&</span><span>zstr</span><span>,</span><span> str</span><span>,</span><span> str_len</span><span>,</span><span>0</span><span>);</span><span>   
    ZVAL_STRINGL</span><span>(&</span><span>zdelim</span><span>,</span><span> delim</span><span>,</span><span> delim_len</span><span>,</span><span>0</span><span>);</span><span>// limit值是explode中允许传递的explode的第三个参数,它允许正负</span><span>if</span><span>(</span><span>limit </span><span>></span><span>1</span><span>)</span><span>{</span><span>
        php_explode</span><span>(&</span><span>zdelim</span><span>,</span><span>&</span><span>zstr</span><span>,</span><span> return_value</span><span>,</span><span> limit</span><span>);</span><span>}</span><span>else</span><span>if</span><span>(</span><span>limit </span><span><span>0</span><span>)</span><span>{</span><span>
        php_explode_negative_limit</span><span>(&</span><span>zdelim</span><span>,</span><span>&</span><span>zstr</span><span>,</span><span> return_value</span><span>,</span><span> limit</span><span>);</span><span>}</span><span>else</span><span>{</span><span>
        add_index_stringl</span><span>(</span><span>return_value</span><span>,</span><span>0</span><span>,</span><span> str</span><span>,</span><span> str_len</span><span>,</span><span>1</span><span>);</span><span>}</span><span>}</span></span>
Salin selepas log masuk
 
Salin selepas log masuk
文章摘自 PHP explode() 函数源码分析
Salin selepas log masuk
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Cadangan popular
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan