您的位置:首页 > 编程语言 > PHP开发

PHP7扩展开发之字符串处理

2016-11-28 12:14 267 查看

前言

这次,我们来看看字符串在PHP扩展里面如何处理。

示例代码如下:

<?php
function str_concat($prefix, $string) {
$len = strlen($prefix);
$substr = substr($string, 0, $len);
if ($substr != $prefix) {
return $prefix." ".$string;
} else {
return $string;
}
}

echo str_concat("hello", "word");
echo "\n";
echo str_concat("hello", "hello bo56.com");
echo "\n";
?>


上面的str_concat方法实现了如下功能:

1、当字符串不包含指定前缀字符串时,把前缀字符串和被检测字符合并返回。

2、当字符串包含指定前缀字符串时,原样返回。

我们将使用PHP扩展的方式实现str_concat功能。

代码

基础代码

这个扩展,我们将在say扩展上增加 str_concat 方法。say扩展相关代码大家请看这篇博文。PHP7扩展开发之hello word 文中已经详细介绍了如何创建一个扩展和提供了源码下载。

实现str_concat方法

str_concat方法的PHP扩展源码:

PHP_FUNCTION(str_concat)
{
zend_string *prefix, *subject, *result;
zval *string;

if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sz", &prefix, &string) == FAILURE) {
return;
}

subject = zval_get_string(string);
if (zend_binary_strncmp(ZSTR_VAL(prefix), ZSTR_LEN(prefix), ZSTR_VAL(subject), ZSTR_LEN(subject), ZSTR_LEN(prefix)) == 0) {
RETURN_STR(subject);
}
result = strpprintf(0, "%s %s", ZSTR_VAL(prefix), ZSTR_VAL(subject));
RETURN_STR(result);
}


代码说明

zend_string是PHP7新增的结构。结构如下:

struct _zend_string {
zend_refcounted_h gc; /*gc信息*/
zend_ulong        h;  /* hash value */
size_t            len; /*字符串长度*/
char              val[1]; /*字符串起始地址*/
};


Zend/zend_string.h
提供了一些
zend_string
处理的一些方法。

ZSTR_
开头的宏方法是
zend_string
结构专属的方法。主要有如下几个:

#define ZSTR_VAL(zstr)  (zstr)->val
#define ZSTR_LEN(zstr)  (zstr)->len
#define ZSTR_H(zstr)    (zstr)->h
#define ZSTR_HASH(zstr) zend_string_hash_val(zstr)


ZSTR_VAL ZSTR_LEN ZSTR_H
宏方法分别对应
zend_string
结构的成员。
ZSTR_HASH
是获取字符串的hash值,如果不存在,就调用hash函数生成一个。

代码中故意把第二个参数转换成zval。主要是为了展现zend为我们提供了一些列的操作方法。如,
zval_get_string
,
zend_binary_strncmp


这些方法在
Zend/zend_operators.h
文件中。

源码下载

tar.gz格式下载

zip格式下载

原文链接:PHP7扩展开发之字符串处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php 扩展