PHP 소스 코드 7에 대한 간략한 토론: nl2br, ltrim, rtrim, Trim 함수 정보

不言
풀어 주다: 2023-04-01 21:56:02
원래의
1606명이 탐색했습니다.

这篇文章主要介绍了关于浅谈PHP源码七:关于nl2br, ltrim, rtrim, trim函数,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

浅谈PHP源码七:关于nl2br, ltrim, rtrim, trim函数

string nl2br ( string string )

Returns string with ‘
‘ inserted before all newlines.

在代码中有注释如下:

/* it is really faster to scan twice and allocate mem once insted scanning once
and constantly reallocing */

程序先计算需要替换的个数,然后一次性计算需要分配的内存大小。从而减少了每次替换都重新分配内存的开销。

由此可见PHP源码的作者的程序优化上下了不少功夫。

源码摘抄如下:

    str = Z_STRVAL_PP(zstr);    //    字符串开始位置
    end = str + Z_STRLEN_PP(zstr);     //    字符串结束地址     /* it is really faster to scan twice and allocate mem once insted scanning once
       and constantly reallocing */
    while (str < end) {       //    计算需要替换的位置个数
        if (*str == &#39;\r&#39;) {
            if (*(str+1) == &#39;\n&#39;) {
                str++;
            }
            repl_cnt++;
        } else if (*str == &#39;\n&#39;) {
            if (*(str+1) == &#39;\r&#39;) {
                str++;
            }
            repl_cnt++;
        } 
        str++;
    }     if (repl_cnt == 0) {    //    如果没有可替换的字符串,直接返回
        RETURN_STRINGL(Z_STRVAL_PP(zstr), Z_STRLEN_PP(zstr), 1);
    } 
     //    给新生成的字符串分配内存
    new_length = Z_STRLEN_PP(zstr) + repl_cnt * (sizeof("<br />") - 1);
    tmp = target = emalloc(new_length + 1); 
    str = Z_STRVAL_PP(zstr);     while (str < end) {
        switch (*str) {
            case &#39;\r&#39;:    //    没有break,直接转下个case
            case &#39;\n&#39;:
                *target++ = &#39;<&#39;;
                *target++ = &#39;b&#39;;
                *target++ = &#39;r&#39;;
                *target++ = &#39; &#39;;
                *target++ = &#39;/&#39;;
                *target++ = &#39;>&#39;;                 if ((*str == &#39;\r&#39; && *(str+1) == &#39;\n&#39;) || (*str == &#39;\n&#39; && *(str+1) == &#39;\r&#39;)) {
                    *target++ = *str++;
                }
                /* lack of a break; is intentional */
            default:
                *target++ = *str;
        } 
        str++;
    }     *target = &#39;\0&#39;;    //    添加最后的结束字符 
    RETURN_STRINGL(tmp, new_length, 0);    //    返回结果
로그인 후 복사

ltrim — Strip whitespace (or other characters) from the beginning of a string

rtrim — Strip whitespace (or other characters) from the end of a string

trim — Strip whitespace (or other characters) from the beginning and end of a string

这三个函数都是调用static void php_do_trim(INTERNAL_FUNCTION_PARAMETERS, int mode)

===》PHPAPI char *php_trim(char *c, int len, char *what, int what_len, zval *return_value, int mode TSRMLS_DC)

实现,依据不同的mode(ltrim => 1, rtrim => 2, trim => 3)实现。

对于第二个参数,指过滤的字符,在默认情况下是 空格 \n\r\t\v\0

在程序中可以看到过滤用的字符仅有char mask[256];即ASCII 码的256个值

在使用php_charmask(unsigned char *input, int len, char *mask TSRMLS_DC)函数创建过滤用的字符HASH数组

如果是1或3(程序实现使用的是 mode & 1),则过滤源字符串前面的字符,从头开始遍历每个字符串,直接hash判断是否是需要过滤的字符,直到第一个不是过滤字符的位置结束

如果是2或 3(程序实现使用的是 mode & 2),则过滤源字符串后面的字符,过程与前面类似。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

浅谈PHP源码六:关于stream_get_wrappers函数

浅谈PHP源码五:关于array 数组的创建

浅谈PHP源码四:关于count函数

위 내용은 PHP 소스 코드 7에 대한 간략한 토론: nl2br, ltrim, rtrim, Trim 함수 정보의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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