目录
-
字符串左右连接
- 正则匹配
字符串左右连接
下面示例是在 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;
}