typedef struct {
pcre *re;
pcre_extra *extra;
int preg_options;
#if HAVE_SETLOCALE
char *locale;
unsigned const char *tables;
#endif
int compile_options;
int refcount;
} pcre_cache_entry;
PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(char *regex, int regex_len TSRMLS_DC);
PHPAPI void php_pcre_match_impl( pcre_cache_entry *pce, char *subject, int subject_len, zval *return_value,
zval *subpats, int global, int use_flags, long flags, long start_offset TSRMLS_DC);
下面举例说明在扩展中使用方法。现在需要开发一个PHP扩展类Mytools,里面有公有静态方法isEmail用于校验是否是邮箱格式。
在php_mytools.h中加入
PHP_METHOD(Mytools,isEmail);
在mytools.c中修改
const zend_function_entry Mytools_class_functions[] = {
PHP_ME(Mytools, isEmail, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
{NULL, NULL, NULL}
};
zend_class_entry *Mytools_ce;
zend_class_entry *Mytools_ce;
PHP_MINIT_FUNCTION(mytools)
{
zend_class_entry Mytools;
INIT_CLASS_ENTRY(Mytools, "Mytools", Mytools_class_functions);
Mytools_ce = zend_register_internal_class_ex(&Mytools, NULL, NULL TSRMLS_CC);
return SUCCESS;
}
PHP_METHOD(Mytools, isEmail){
char *regex="/^([0-9a-zA-Z]+[_.0-9a-zA-Z-]*)@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$/i";
int regex_len=strlen(regex);/* Regular expression */
char *subject; /* String to match against */
int subject_len;
pcre_cache_entry *pce; /* Compiled regular expression */
zval *subpats = NULL; /* Array for subpatterns */
long flags = 0; /* Match control flags */
long start_offset = 0; /* Where the new search starts */
zval *result;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &subject, &subject_len) == FAILURE) {
RETURN_FALSE;
}
/* Compile regex or get it from cache. */
if ((pce = pcre_get_compiled_regex_cache(regex, regex_len TSRMLS_CC)) == NULL) {
RETURN_FALSE;
}
MAKE_STD_ZVAL(result);
php_pcre_match_impl(pce, subject, subject_len, result, subpats, 0, 0, flags, start_offset TSRMLS_CC);
if(Z_LVAL_P(result) == 1)
RETURN_TRUE
RETURN_FALSE;
}
编译安装重启服务器后测试
var_dump(Mytools::isEmail('qq12345qq.com')); //bool(false)
var_dump(Mytools::isEmail('qq12345-11@qq.com')); //bool(true)
var_dump(Mytools::isEmail('-qq12345-11@qq.com'));//bool(false)
文章地址:http://my.oschina.net/u/554660/blog/170464,转载请注明出处,谢谢