使用正则表达式匹配需要了解下结构体和API函数。 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";
intregex_len=strlen(regex);/* Regular expression */
char*subject;/* String to match against */
intsubject_len;
pcre_cache_entry *pce;/* Compiled regular expression */
zval *subpats = NULL;/* Array for subpatterns */
longflags = 0;/* Match control flags */
longstart_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)