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

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

内容导读

收集整理的这篇技术教程文章主要介绍了浅谈PHP源码七:关于nl2br,ltrim,rtrim,trim函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2929字,纯文字阅读大概需要5分钟

内容图文

这篇文章主要介绍了关于浅谈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 == 'r') {





if (*(str+1) == 'n') {







str++;





}





repl_cnt++;



} else if (*str == 'n') {





if (*(str+1) == 'r') {







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 'r':

//

没有break,直接转下个case





case 'n':







*target++ = '<';







*target++ = 'b';







*target++ = 'r';







*target++ = ' ';







*target++ = '/';







*target++ = '>';







 if ((*str == 'r' && *(str+1) == 'n') || (*str == 'n' && *(str+1) == 'r')) {









*target++ = *str++;







}







/* lack of a break; is intentional */





default:







*target++ = *str;



}



 str++;

}

 *target = '';

//

添加最后的结束字符

 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)实现。

对于第二个参数,指过滤的字符,在默认情况下是 空格 nrtv

在程序中可以看到过滤用的字符仅有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源码七:关于nl2br, ltrim, rtrim, trim函数的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的浅谈PHP源码七:关于nl2br,ltrim,rtrim,trim函数全部内容,希望文章能够帮你解决浅谈PHP源码七:关于nl2br,ltrim,rtrim,trim函数所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com