网站地图    收藏   

主页 > 后端 > php资料库 >

PHP中nl2br, ltrim, rtrim, trim函数使用教程_自学php网

来源:自学PHP网    时间:2014-12-04 22:12 作者: 阅读:

[导读] 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 */ 程序先计算需要替...

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
 


这三个函数都是调用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程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论