> php教程 > php手册 > 본문

PHP explode() 函数源码分析

WBOY
풀어 주다: 2016-06-06 19:55:33
원래의
1377명이 탐색했습니다.

在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>
로그인 후 복사
 
로그인 후 복사
文章摘自 PHP explode() 函数源码分析
로그인 후 복사
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!