php 擴展 返回字符串,基于PHP7的PHP擴展開發之四(字符串的處理)

目的:熟悉字符串在PHP擴展里面如何處理

要實現的PHP代碼如下:

1、當字符串不包含指定前綴字符串時,把前綴字符串和被檢測字符合并返回。

2、當字符串包含指定前綴字符串時,原樣返回。 我們將使用PHP擴展的方式實現str_concat功能。

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 lostphp.com");

echo "\n";

?>

基礎代碼

在myecho擴展上增加 str_concat 方法。

實現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);

}

找到PHP_FE_END

在上面增加

PHP_FE(str_concat, NULL)

代碼說明

zend_string是PHP7新增的結構。結構如下:

[codee]

struct _zend_string {

zend_refcounted_h gc; /*gc信息*/

zend_ulong h; /* hash value */

size_t len; /*字符串長度*/

char val[1]; /*字符串起始地址*/

};

[/codee]

在Zend/zend_string.h提供了一些zendstring處理的一些方法。 “ZSTR“開頭的宏方法是zend_string結構專屬的方法。主要有如下幾個:

[codee]

#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)

[/codee]

ZSTR_VAL ZSTR_LEN ZSTR_H宏方法分別對應zend_string結構的成員。ZSTR_HASH是獲取字符串的hash值,如果不存在,就調用hash函數生成一個。

代碼中故意把第二個參數轉換成zval。主要是為了展現zend為我們提供了一些列的操作方法。如,zval_get_string, zend_binary_strncmp。 這些方法在Zend/zend_operators.h文件中。

更多宏方法請查看 Zend/zend_API.h中的相關代碼。

編譯生成擴展 參考《基于PHP7的PHP擴展開發之一(hello word)》

測試

echo str_concat("hello", "word");

echo "\n";

echo str_concat("hello", "hello lostphp.com");

echo "\n";

輸出

hello word

hello lostphp.com

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457125.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457125.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457125.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對象之int介紹

#Auther Bob #--*--conding:utf-8 --*-- #創建兩個int的對象&#xff0c;age1和age2age1 10 age2 int(1)#查看對象的類print(type(age1))# <class int>print(type(age2))# <class int> #bit_length表示一個十進制數最少需要占用多個二進制位print(age1.bit_lengt…

Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.

谷歌瀏覽器報錯 版本 73.0.3683.103&#xff08;正式版本&#xff09; &#xff08;32 位&#xff09;報錯內容如下Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.jquery.js:2 Cross-Origin Read Blocking (CORB) blocked cros…

OpenStack 之vmware機器遷移到openstack集群

原理 openstack本身是支持使用vmware格式的鏡像的&#xff0c;但是是需要我們我們在/etc/nova/nova.conf的配置文件中指定該計算節點使用vmware的驅動 123456789101112# Driver to use for controlling virtualization. Options# include: libvirt.LibvirtDriver, xenapi.XenAP…

解決Django靜態文件配置pycharm高光問題

就困擾了我半天的Django靜態文件配置問題 更改了setting 文件后 文件參考問題總會高亮讓然覺得又錯誤怪怪的 所以索性直接眼不見心不煩 具體操作如下圖&#xff1a; 就這樣就可以啦 大功告成&#xff01; 也順便提一下靜態文件配置問題&#xff1a; Django靜態加載的設置…

Weblogic的管理服務器與受管服務器

weblogic管理服務器和受管服務器&#xff1a; 域包含一個稱為“管理服務器”的特殊 WebLogic Server 實例&#xff0c;它是您配置和管理域中所有資源的中心點&#xff0c;一個域有僅只有一個管理服務器實例。 在生產環境中&#xff0c;應將 Web 應用程序、EJB 和其他資源部…

python神經網絡可視化,python中的神經網絡感受野可視化

這是我想出的解決方案。謝謝mprat的幫助。在我發現spectralcolormap最適合這種任務&#xff0c;而且我還添加了您可以指定的邊框。在from matplotlib import pyplotimport numpy as npborder 2images_amount 300row_amount 10col_amount 30image_height 28image_width 28…

Qt 多媒體音頻模擬按鈕發音(音視頻啟動)

## 項目演示 平臺:windows或者ubuntu 要求:平臺需要支持音頻播放功能 文件格式:.wav 可以使用剪映生成,音頻部分,我這里是簡短的音樂 # Qt 多媒體簡介 Qt QSound是Qt框架中的一個類,用于播放音頻文件。它可以在Qt應用程序中實現簡單的音頻播放功能,包括播放、暫停和…

ASP.NET MVC5 ModelBinder

什么是ModelBinding ASP.NET MVC中&#xff0c;所有的請求最終都會到達某個Controller中的某個Action并由該Action負責具體的處理和響應。為了能夠正確處理請求&#xff0c;Action的參數&#xff08;如果有的話&#xff09;&#xff0c;必須在Action執行之前&#xff0c;根據相…

Day07-函數(2)

1.函數類型 函數也是一種類型&#xff0c;我們自定義的函數就是函數對象&#xff0c;函數名保存了函數對象的引用&#xff08;地址&#xff09; def test():print(我是測試函數) ? print(test) #函數名是變量&#xff0c;指向了函數對象 pf test #pf變量也指向了函數對…

php在html里面的位置,關于script在html中的擺放位置解析

以前一直覺得script在html中的任何位置都可以&#xff0c;今天做一個需求的時候才更正了自己的錯誤思想啊--script的位置也不是隨便放的。本文主要談論關于script在html中的擺放位置。小編覺得挺不錯的&#xff0c;現在就分享給大家&#xff0c;也給大家做個參考。希望能幫助到…

Protocol Buffer技術詳解(C++實例)

原文&#xff1a;http://www.cnblogs.com/stephen-liu74/archive/2013/01/04/2842533.html 這篇Blog仍然是以Google的官方文檔為主線&#xff0c;代碼實例則完全取自于我們正在開發的一個Demo項目&#xff0c;通過前一段時間的嘗試&#xff0c;感覺這種結合的方式比較有利于培訓…

yaml 解決問題

yaml 是什么&#xff1f; 在 github 一些開源項目里經常可以看到 .travis.yml 文件&#xff0c;后來接觸持續集成這個概念時發現很多文件都是 .yml 后綴的文件。我在 阮一峰-YAML 語言教程 里了解了它的作用以及基本寫法&#xff0c;他的那篇文章描述的略微有點啰嗦&#xff0…

2016 7 25 鏈表

1 #include<stdio.h>2 #include<stdlib.h>3 /* 4 usingnamespacestd;5 6 structNode7 {8 int data;//數據域9 struct Node*next;//指針域10 };11 12 /*13 Create14 *函數功能&#xff1a;創建鏈表.15 *輸入&#xff1a;各節點的data16 *返回值&#xff1a;指…

php數值操作,php數值計算num類簡單操作示例

php數值計算num類簡單操作示例,在線,計算器,小數,整數,程序設計php數值計算num類簡單操作示例易采站長站&#xff0c;站長之家為您整理了php數值計算num類簡單操作示例的相關內容。本文實例講述了php數值計算num類簡單操作。分享給大家供大家參考&#xff0c;具體如下&#xff…

YAML-學習筆記!

YAML學習筆記 一、YAML簡介 YAML&#xff0c;即YAML Ain’t Markup Language的縮寫&#xff0c;YAML 是一種簡潔的非標記語言。YAML以數據為中心&#xff0c;使用空白&#xff0c;縮進&#xff0c;分行組織數據&#xff0c;從而使得表示更加簡潔易讀。 二、YAML語法 1、基本規…

CentOS遠程監控

近日&#xff0c;因工作需要&#xff0c;學習了CentOS遠程監控的水平有限&#xff0c;多指教。 遠程訪問CentOS&#xff0c;包括三種方式ssh&#xff0c;telnet&#xff0c;vnc。 本例涉及的是以vnc遠程訪問CentOS。指令在root下操作。注意&#xff1a;vnc的端口為5900&#xf…

aix oracle 10.2.0.1 升級 10.2.0.4,AIX Oracle RAC 升級到10.2.0.4.0要特別注意的問題 - 愛肯的專欄 ......

AIX Oracle RAC 升級到10.2.0.4.0過程有如下報錯(直接升級到10.2.0.4不需要應用Patch:6160398)&#xff1a;rootbwgl_db2:/u01/app/oracle/crs_1/bin# /u01/app/oracle/crs_1/install/root102.shError : Please change the CRS_ORACLE_USER id to have the following OS capabi…

將文件提交到github的兩種方法

方法一 簡要步驟如下&#xff1a; 登陸github&#xff0c;創建git倉庫。記此git倉庫的地址為[github_repository_url]&#xff0c;例如git倉庫的地址&#xff1a;https://github.com/galian123/nodejs_http_server 在本地的工程目錄執行git init&#xff0c;此工程目錄是要提…

Visual Studio 2017新版發布,極大提高開發效率丨附下載

最新的Visual Studio 2017免費下載&#xff1a;https://www.evget.com/product...【包含Professional、Enterprise、Community版本】 為任何開發、應用和平臺提供無與倫比的效率&#xff0c;Visual Studio 2017 候選發布。 提高了效率 代碼導航、IntelliSense、重構、代碼修復和…

BGP路由協議詳解(完整篇)

原文鏈接&#xff1a;http://xuanbo.blog.51cto.com/499334/465596/ 2010-12-27 12:02:45 上個月我寫一篇關于BGP協議的博文&#xff0c;曾許諾過要完善這個文檔&#xff0c;但因最近的工作和授課很忙&#xff0c;所以沒有時間進行完善。為了實現這個承諾&#xff0c;我在去外…