taoCMS是基于php+sqlite/mysql的国内最小(100Kb左右)的功能完善、开源免费的CMS管理系统

解读zend_api字符串替换之php_str_replace_in_subject

2012-04-05

static void php_str_replace_in_subject(zval *search, zval *replace, zval **subject, zval *result, int case_sensitivity, int *replace_count)
{
zval   **search_entry,
     **replace_entry = NULL,
      temp_result;
char   *replace_value = NULL;
int    replace_len = 0;

/* Make sure we're dealing with strings. */ 
convert_to_string_ex(subject);
Z_TYPE_P(result) = IS_STRING;
如果原字符串为空哪么返回空
if (Z_STRLEN_PP(subject) == 0) {
   ZVAL_STRINGL(result, "", 0, 1);
   return;
}
如果要查找的是数组
/* If search is an array */
if (Z_TYPE_P(search) == IS_ARRAY) {
   /* Duplicate subject string for repeated replacement */
   *result = **subject;
   拷贝**subject值(其中可以含有hash)
   zval_copy_ctor(result);
   清楚引用标识以及引用计数
   INIT_PZVAL(result);
   将指针指向数组第一个元素
   zend_hash_internal_pointer_reset(Z_ARRVAL_P(search));
        如果替换后的值为数组,将指针指向第一个元素,否则直接取值
   if (Z_TYPE_P(replace) == IS_ARRAY) {
    zend_hash_internal_pointer_reset(Z_ARRVAL_P(replace));
   } else {
    /* Set replacement value to the passed one */
    replace_value = Z_STRVAL_P(replace);
    replace_len = Z_STRLEN_P(replace);
   }
        循环要查找的字符串并且将值放进数组search_entry
        zend_hash_get_current_data得到当前指针所指单元的值
   /* For each entry in the search array, get the entry */
   while (zend_hash_get_current_data(Z_ARRVAL_P(search), (void **) &search_entry) == SUCCESS) {
    /* Make sure we're dealing with strings. */ 
    其实相当于获得search_entry的拷贝,该拷贝可以自由操作销毁不会影响其他变量
    SEPARATE_ZVAL(search_entry);
    convert_to_string(*search_entry);
    如果当前要查找的字符串为空,那么指针跳到下一个元素
    if (Z_STRLEN_PP(search_entry) == 0) {
     zend_hash_move_forward(Z_ARRVAL_P(search));
     如果替换值为数组同样跳到下一个因为 当前要查找的为空了要替换的也就没有作用了,并且跳过本次对
     查找字符串组的循环继续进行进行下一个值
     if (Z_TYPE_P(replace) == IS_ARRAY) {
      zend_hash_move_forward(Z_ARRVAL_P(replace));
     }
     continue;
    }
            如果要替换的字符串为数组,并且当前所查找字符串循环位置的值不为空
    /* If replace is an array. */
    if (Z_TYPE_P(replace) == IS_ARRAY) {
     /* Get current entry */
     如果当前可以取到值则娶当前指针的值和长度否则替换为空,注意这里没有循环哦不同于while
     if (zend_hash_get_current_data(Z_ARRVAL_P(replace), (void **)&replace_entry) == SUCCESS) {
      /* Make sure we're dealing with strings. */ 
      convert_to_string_ex(replace_entry);
     
      /* Set replacement value to the one we got from array */
      replace_value = Z_STRVAL_PP(replace_entry);
      replace_len = Z_STRLEN_PP(replace_entry);

      zend_hash_move_forward(Z_ARRVAL_P(replace));
     } else {
      /* We've run out of replacement strings, so use an empty one. */
      replace_value = "";
      replace_len = 0;
     }
    }
    下边的大概就是替换函数了,google坏了上不去百度雅虎没结果需要等等知道结果了
    一个字符与字符串的情况
    if (Z_STRLEN_PP(search_entry) == 1) {
     php_char_to_str_ex(Z_STRVAL_P(result),
         Z_STRLEN_P(result),
         Z_STRVAL_PP(search_entry)[0],
         replace_value,
         replace_len,
         &temp_result,
         case_sensitivity,
         replace_count);
    } else if (Z_STRLEN_PP(search_entry) > 1) {
     Z_STRVAL(temp_result) = php_str_to_str_ex(Z_STRVAL_P(result), Z_STRLEN_P(result),
                 Z_STRVAL_PP(search_entry), Z_STRLEN_PP(search_entry),
                 replace_value, replace_len, &Z_STRLEN(temp_result), case_sensitivity, replace_count);
    }
            释放前面result内存
    efree(Z_STRVAL_P(result));
    Z_STRVAL_P(result) = Z_STRVAL(temp_result);
    Z_STRLEN_P(result) = Z_STRLEN(temp_result);

    是否表示没有执行成功?直接返回了?
    if (Z_STRLEN_P(result) == 0) {
     return;
    }

    zend_hash_move_forward(Z_ARRVAL_P(search));
   }
} else {
   如果超找的只是一个字符不是字串
     if (Z_STRLEN_P(search) == 1) {
    php_char_to_str_ex(Z_STRVAL_PP(subject),
        Z_STRLEN_PP(subject),
        Z_STRVAL_P(search)[0],
        Z_STRVAL_P(replace),
        Z_STRLEN_P(replace),
        result,
        case_sensitivity,
        replace_count);
   } else if (Z_STRLEN_P(search) > 1) {
    Z_STRVAL_P(result) = php_str_to_str_ex(Z_STRVAL_PP(subject), Z_STRLEN_PP(subject),
              Z_STRVAL_P(search), Z_STRLEN_P(search),
              Z_STRVAL_P(replace), Z_STRLEN_P(replace), &Z_STRLEN_P(result), case_sensitivity, replace_count);
   } else {
    *result = **subject;
    zval_copy_ctor(result);
    INIT_PZVAL(result);
   }
}
}

类别:技术文章 | 阅读:213731 | 评论:0 | 标签:zend php

想收藏或者和大家分享这篇好文章→

“解读zend_api字符串替换之php_str_replace_in_subject”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

taoCMS发布taoCMS 3.0.2(最后更新21年03月15日),请大家速速升级,欢迎大家试用和提出您宝贵的意见建议。

捐助与联系

☟请使用新浪微博联系我☟

☟在github上follow我☟

标签云