php扩展开发-正则表达式

 正则表达式PHPAPI是在PCRE的基础上封装了一层,调用起来更加方便。在PHP扩展中调用正则表达式PHPAPI时,首先确认扩展目录下有pcre这个目录。其次在c文件开头加载php_pcre.h头文件。  使用正则表达式匹配需要了解下结构体和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";
	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,转载请注明出处,谢谢


转载于:https://my.oschina.net/u/554660/blog/170464

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值