PHP7/5扩展开发函数手册(7) - 字符串常用处理

目录

  • 字符串左右连接

  • 正则匹配

 

字符串左右连接

下面示例是在 PHP7 下运行的代码, PHP5 暂未实现,大家可以自行研究,这里一定注意, 由正则函数产生的对象,我们不要主动释放,否则会出现段错误。

zval * relation;
SW_ALLOC_INIT_ZVAL(relation);
SW_ZVAL_STRING(relation, "table user1", 1);

//相当于php中的 "USING (" . $relation . ")" 
relation = ycroute_string_rjoin(ycroute_string_ljoin("USING (", relation), ")");

zval* ycroute_string_ljoin(char* str, zval* p)
{
	char *tmp = Z_STRVAL_P(p);
	int old_len = Z_STRLEN_P(p);
	int new_len = strlen(str);
	int total_current_len = old_len + new_len;
	
	zend_string *ret = zend_string_alloc(total_current_len, 0);
	memcpy(ZSTR_VAL(ret), str, new_len);
	memcpy(ZSTR_VAL(ret) + new_len, tmp, old_len);
	ZSTR_VAL(ret)[total_current_len] = '\0';
	Z_STR_P(p) = ret;
	Z_TYPE_INFO_P(p) = IS_STRING_EX;
	efree(tmp);
	return p;
}

zval* ycroute_string_rjoin(zval* p, char* str)
{
	char *tmp = Z_STRVAL_P(p);
	int old_len = Z_STRLEN_P(p);
	int new_len = strlen(str);
	int total_current_len = old_len + new_len;
	
	zend_string *ret = zend_string_alloc(total_current_len, 0);
	memcpy(ZSTR_VAL(ret), tmp, old_len);
	memcpy(ZSTR_VAL(ret) + old_len, str, new_len);
	ZSTR_VAL(ret)[total_current_len] = '\0';
	Z_STR_P(p) = ret;
	Z_TYPE_INFO_P(p) = IS_STRING_EX;
	efree(tmp);
	return p;
}

正则匹配函数

#include <ext/pcre/php_pcre.h>

int ycroute_preg_match(char* regex_str, char* subject_str, zval *matches TSRMLS_DC)
{
	if(regex_str == NULL || subject_str == NULL) {
		return 0;
	}
	
	pcre_cache_entry *pce;
	zend_string *regex = zend_string_init(regex_str, strlen(regex_str), 0);
	pce = pcre_get_compiled_regex_cache(regex TSRMLS_CC);
	zend_string_free(regex);
	
	if (pce == NULL) {
		return 0;
	}
	
	//执行正则
	zval return_value;
	php_pcre_match_impl(pce, subject_str, strlen(subject_str), & return_value, matches, 0, 0, 0, 0 TSRMLS_CC);
	return Z_LVAL(return_value);
}


char *select_context(char *table, zval *join, zval** columns, zval *where, zval *column_fn)
{
	//查找表别名如 table(alias) 的情况
	zval *matches;
	SW_ALLOC_INIT_ZVAL(matches);
        int ret = ycroute_preg_match("/([a-zA-Z0-9_\\-]*)\\s*\\(([a-zA-Z0-9_\\-]*)\\)/i", table, matches TSRMLS_CC);
    
  ...
	
	return NULL;
}

猜你喜欢

转载自blog.csdn.net/caohao0591/article/details/82587986
今日推荐