php正则扩展,php扩展开发-正则表达式

使用正则表达式匹配需要了解下结构体和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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值