浅谈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 = '