浅谈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 = /0 // 添加最后的结束字符 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
这三个函数都是调用html' target='_blank'>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源码七:关于nl2br, ltrim, rtrim, trim函数的详细内容,PHP教程
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
新闻热点
疑难解答