php过滤函数trim实现原理

发布时间:2020-06-02编辑:脚本学堂
本文介绍了php中过滤空格函数trim的实现原理,c语言代码解析,有关trim函数的原理剖析,有需要的朋友参考下。

本节内容:
php trim函数的原理剖析
 

复制代码 代码示例:

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 < end; input++) {
  c=*input;
  if ((input+3 < end) && input[1] == '.' && input[2] == '.'
    && input[3] >= c) {
   memset(mask+c, 1, input[3] - c + 1);
   input+=3;
  } else if ((input+1 < end) && input[0] == '.' && input[1] == '.') {
   /* Error, try to be as helpful as possible:
      (a range ending/starting with '.' won't be captured here) */
   if (end-len >= 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;
   }
   /* FIXME: better error (a..b..c is the only left possibility?) */
   php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid '..'-range");
   result = FAILURE;
   continue;
  } else {
   mask[c]=1;
  }
 }
 return result;
}
/* }}} */

/* {{{ php_trim()
 * mode 1 : trim left
 * mode 2 : trim right
 * mode 3 : trim left and right
 * what indicates which chars are to be trimmed. NULL->default (' tnrv')
 */
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*)" nrtv", 6, mask TSRMLS_CC);
 }

 if (mode & 1) {
  for (i = 0; i < len; i++) {
   if (mask[(unsigned char)c[i]]) {
    trimmed++;
   } else {
    break;
   }
  }
  len -= trimmed;
  c += trimmed;
 }
 if (mode & 2) {
  for (i = len - 1; 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_do_trim
 * Base for trim(), rtrim() and ltrim() functions.
 */
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() TSRMLS_CC, "s|s", &str, &str_len, &what, &what_len) == FAILURE) {
  return;
 }
 
 php_trim(str, str_len, what, what_len, return_value, mode TSRMLS_CC);
}
/* }}} */

/* {{{ proto string trim(string str [, string character_mask])
   Strips whitespace from the beginning and end of a string */
PHP_FUNCTION(trim)
{
 php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 3);
}
/* }}} */

/* {{{ proto string rtrim(string str [, string character_mask])
   Removes trailing whitespace */
PHP_FUNCTION(rtrim)
{
 php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 2);
}
/* }}} */

/* {{{ proto string ltrim(string str [, string character_mask])
   Strips whitespace from the beginning of a string */
PHP_FUNCTION(ltrim)
{
 php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
}
/* }}} */