iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php trim函数是怎样实现的
  • 758
分享到

php trim函数是怎样实现的

2023-06-29 01:06:07 758人浏览 泡泡鱼
摘要

这篇文章跟大家分析一下“PHP trim函数是怎样实现的”。内容详细易懂,对“php trim函数是怎样实现的”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“php trim函数是

这篇文章跟大家分析一下“PHP trim函数是怎样实现的”。内容详细易懂,对“php trim函数是怎样实现的”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“php trim函数是怎样实现的”的知识吧。

php trim函数的实现原理:1、定义一个len来存储字符串的长度;2、判断c中的字符是否在hashmask中存在;3、如果存在,将len减去一位;4、如果不存在则停止操作。

本文操作环境:windows7系统、PHP7.1版、DELL G3电脑

php源码分析trim函数的实现

在实际开发中遇到关于 trim 函数的2个问题:
   1:使用trim函数不能去除2个以上的连续点号(.)
   2 : 使用trim函数去除字符串的问题
先说一下第一个问题。
下面的一段代码:
   php -r "echo trim('abcdcba...','...');"
我的本意是要将字符串abcdcba...最后三个点去掉,结果是报错。

PHP Warning:  trim(): Invalid '..'-range, no character to the left of '..' in Command line code on line 1Warning: trim(): Invalid '..'-range, no character to the left of '..' in Command line code on line 1PHP Warning:  trim(): Invalid '..'-range, no character to the right of '..' inCommand line code on line 1Warning: trim(): Invalid '..'-range, no character to the right of '..' in Command line code on line 1

这个问题其实很好解释,因为 trim 函数本书可以范围操作,例如 如果trim函数的第二个参数 a..d,它就会把a b c d 都去掉。因为省略号的原因,所以trim函数的第二个参数不能用..开头或者结尾。

第二个问题:
再看一个例子:
php -r 'echo trim("abcdcba","abc")."\n";'
我的本意是将字符串abcdcba最前面的abc去掉保留dcba,但结果却是这样的:
d
也就是说他会把a b c分别去掉。这应该算是个坑吧。

通过对底层源代码的分析来说一下为什么会出现这2种情况。
trim函数的源代码师在php代码根目录开始的 ext/standard/string.c
函数的定义如下:

PHP_FUNCTioN(trim){    php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 3);}

可以看到,定义调用了另外的函数,函数体如下:

static void php_do_trim(INTERNAL_FUNCTION_PARAMETERS, int mode){    char *str;    char *what = NULL;    int str_len, what_len = 0;    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRM\_CC, "s|s", &str, &str_len, &what, &what_len) == FaiLURE) {        return;    }     php_trim(str, str_len, what, what_len, return_value, mode TSRMLS_CC);}

zend_parse_parameters函数的作用就是接受参数,有兴趣的同学可以查阅相关资料。从代码可以看到,函数接受了2个字符串类型的参数,一个str,就是需要处理的字符串,第二个参数是what,用来表示需要去除的字符。
这个函数在最后用调用了另外一个函数,函数php_trim,函数体如下:

PHPapi char *php_trim(char *c, int len, char *what, int what_len, zval *return_value, int mode TSRMLS_DC){    reGISter int i;    int trimmed = 0;    char mask[256];            if(what) {            php_charmask((unsigned char*)what, what_len, mask TSRMLS_CC);        } else {            php_charmask((unsigned char*)" \n\r\t\v\0", 6, mask TSRMLS_CC);        }        if (mode & 1) {            for (i = 0; i = 0; i--) {                if (mask[(unsigned char)c[i]]) {                    len--;                } else {                    break;                }            }        }        if (return_value) {            RETVAL_STRINGL(c, len, 1);        } else {            return estrndup(c, len);        }        return "";}

这个函数就是php真正处理去除操作的结构。
刚开始就是定义了简单的变量,再下面对变量what有一个判断,来判断是否传递了要去除的字符。可以看到,根据是不是传递了what,函数传递给php_charmask函数的参数不一样,从这儿可以看出,如果trim没有传要去除的字符,默认情况是去除" \n\r\t\v\0"六个字符的,下面来看看php_charmask函数进行了哪些操作。

static inline int php\_charmask(unsigned char *input, int len, char *mask TSRMLS_DC){    unsigned char *end;    unsigned char c;    int result = SUCCESS;    memset(mask, 0, 256);    for (end = input+len; input = c) {             memset(mask+c, 1, input[3] - c + 1);            input+=3;        } else if ((input+1 = input) { /\* there was no 'left' char \*/                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid '..'-range, no character to the left of '..'");                result = FAILURE;                continue;            }            if (input+2 >= end) { /\* there is no 'right' char \*/                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid '..'-range, no character to the right of '..'");                result = FAILURE;                continue;            }            if (input[-1] > input[2]) { /\* wrong order \*/                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid '..'-range, '..'-range needs to be incrementing");                result = FAILURE;                continue;            }                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid '..'-range");            result = FAILURE;            continue;        } else {            mask[c]=1;        }    }        return result;}

这个函数的作用主要是,创建要去除的字符的哈希对应关系,刚开始考虑了特殊情况像a..d这样的情况(从这儿也能看出来为什么trim函数不能处理...的情况)。后面就是建立hash结构的过程。最后的结果是一个数组,以要去除的字符是 abc 为例:

    mask['a'] = 1;    mask['b'] = 1;    mask['c'] = 1;

这样的hash结构,最后返回的就是这个 mask(实际没有返回,使用引用变量传值的方式做到数据的返回)
前面的都是准备工作,后面的就是真正处理去除操作了。
通过源代码可以看到,下面的操作先对mode这个变量做了判断,那么mode这个变量是干嘛的?答案就是用来处理 ltrim rtirm trim3个函数的。
下面师一段C语言代码:

#includeint main(){     printf("%d\n",1&1);     printf("%d\n",2&2);     printf("%d\n",3&1);     printf("%d\n",3&2);     return 0;}

这段代码的输出结果如下:

1212

通过这个大家可以看出来,trim的底层是怎么处理的。先对mode 分别取模,再做相应的操作。
实际的去除操作就很简单了。
定义一个len来存储字符串的长度,c 是一个字符指针,刚开始从左边开始去除,判断c中的字符是否在hashmask中存在,如果存在,就将c 的指针向后移动一位,将len减去一位,如果发现*c的字符不存在于hashmask中,停止操作(可能和实际代码逻辑不不一致,但思想师一样的)。相关代码如下:

for (i = 0; i

左边操作完成以后,右边的操作比较简单,从*c最右边开始匹配,如果匹配到,就将len的长度减1,如果没有旧停止操作。相关的代码如下:

for (i = len - 1; i >= 0; i--) {    if (mask[(unsigned char)c[i]]) {        len--;    } else {        break;    }}

最后就是一个简单返回操,把c指针现在指向的位置以后的len个字符返回。实现返回的操作。整个过程完成。
相关代码如下:

if (return_value) {   RETVAL_STRINGL(c, len, 1);} else {   return estrndup(c, len);}

关于php trim函数是怎样实现的就分享到这里啦,希望上述内容能够让大家有所提升。如果想要学习更多知识,请大家多多留意小编的更新。谢谢大家关注一下编程网网站!

--结束END--

本文标题: php trim函数是怎样实现的

本文链接: https://www.lsjlt.com/news/321650.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • php trim函数是怎样实现的
    这篇文章跟大家分析一下“php trim函数是怎样实现的”。内容详细易懂,对“php trim函数是怎样实现的”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“php trim函数是...
    99+
    2023-06-29
  • php中trim函数实例用法
    trim函数用于去除字符串两端的空白字符或其他指定字符,并返回处理后的字符串。trim函数的语法如下:```phptrim...
    99+
    2023-08-15
    PHP
  • php中trim函数怎么使用
    在PHP中,trim()函数用于删除字符串的开头和结尾的空格或其他指定字符。它的语法如下:```phptrim(...
    99+
    2023-08-16
    php trim
  • oracle trim函数的用法是什么
    Oracle中的TRIM函数用于删除字符串的前导或尾随空格。它的基本语法如下: TRIM([ leading | trail...
    99+
    2024-04-09
    oracle
  • java的trim函数怎么使用
    在Java中,`trim()`函数是用于去除字符串两端的空白字符的方法。可以将其应用于字符串对象上。以下是使用`tri&#...
    99+
    2023-08-31
    java
  • 怎么使用java的trim函数去空格
    使用Java的trim()函数可以去除字符串两端的空格,但不能去除字符串中间的空格。可以按照以下方式使用trim...
    99+
    2023-08-31
    java
  • PHP 函数参数类型的演变历史是怎样的?
    php 函数参数类型历史演变:php 4 之前:松散类型,无类型提示或强制执行。php 4:引入类型提示,但仅作为注释。php 5:增强了类型提示,引入了严格模式,但仍然支持松散类型。p...
    99+
    2024-04-10
    php 函数参数类型
  • PHP 函数参数类型的演变历史是怎样的?
    php 函数参数类型历史演变:php 4 之前:松散类型,无类型提示或强制执行。php 4:引入类型提示,但仅作为注释。php 5:增强了类型提示,引入了严格模式,但仍然支持松散类型。p...
    99+
    2024-04-10
    php 函数参数类型
  • php怎么实现intval()函数
    PHP是一门广泛应用于Web开发的脚本语言,具有简单易学、功能强大、文档详细等特点。其中,intval()函数是一个非常重要的函数,用于将一个字符串转换为整数。本文将介绍PHP如何实现intval()函数。首先,让我们来了解intval()...
    99+
    2023-05-14
    intval() php
  • PHP gc_enable() 函数的实现
    在 PHP 中,垃圾收集 (GC) 是自动释放程序不再使用的内存的过程。 gc_enable 函数用于启用 PHP 中的垃圾收集器,使其自动释放内存。 在本文中,我们将深入了解 PHP 中 gc_e...
    99+
    2024-02-27
  • PHP gc_collect_cycles() 函数的实现
    gc_collect_cycles() 是 PHP 中的一个函数,它启动垃圾收集周期,这是一个释放不再使用的内存的过程。 PHP 可以手动或自动调用此函数,具体取决于垃圾收集器的配置方式。 该函数的...
    99+
    2024-02-27
  • 实用技巧:如何利用PHP中的trim函数处理中文空格
    在PHP编程中,处理字符串时经常会遇到空格的问题,这其中包括中文空格。在实际开发中,我们常常会使用trim函数来去除字符串两端的空格,但是对于中文空格的处理相对复杂一些。本文将介绍如何...
    99+
    2024-04-02
  • JavaScript中函数进阶是怎样现进行的
    JavaScript中函数进阶是怎样现进行的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。全局作用域· 全局作用域是最大的作用域·&...
    99+
    2024-04-02
  • PHP中怎样实现数组排序
    本篇文章为大家展示了PHP中怎样实现数组排序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。快速创建数组的函数range()比如range()函数可以快速创建从1到9的数字数组:  ...
    99+
    2023-06-17
  • JavaScript 函数的闭包是怎样的
    JavaScript 函数的闭包是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 前言我们知道,作用域链查找标识符的顺序是从当前作用域开始一级一级往上查找。...
    99+
    2023-06-16
  • 怎么用VBS实现PHP的md5_file函数
    这篇文章主要介绍“怎么用VBS实现PHP的md5_file函数”,在日常操作中,相信很多人在怎么用VBS实现PHP的md5_file函数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用VBS实现PHP的m...
    99+
    2023-06-08
  • php是怎么实现数组的
    本文小编为大家详细介绍“php是怎么实现数组的”,内容详细,步骤清晰,细节处理妥当,希望这篇“php是怎么实现数组的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先,PHP中的数组类型非常灵活,可以存储不同数据...
    99+
    2023-07-06
  • Spring 函数是如何在 PHP Laravel 中实现的?
    Spring 函数是一个开源的函数计算框架,它可以让开发者轻松地编写和运行无服务器应用程序。PHP Laravel 是一个流行的 PHP 框架,它提供了许多有用的功能和工具,使开发者可以更快地构建 Web 应用程序。在本文中,我们将探讨如...
    99+
    2023-07-20
    laravel 函数 spring
  • PHP加盐实现函数的方法是什么
    今天小编给大家分享一下PHP加盐实现函数的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。第一步:生成一个随机的盐值...
    99+
    2023-07-05
  • php实现上传功能的函数是什么
    这篇文章主要介绍“php实现上传功能的函数是什么”,在日常操作中,相信很多人在php实现上传功能的函数是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php实现上传功能的函数是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作