这篇文章主要介绍了关于浅谈PHP源码七:关于nl2br, ltrim, rtrim, trim函数,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
浅谈PHP源码七:关于nl2br, ltrim, rtrim, trim函数
string nl2br ( string string )
Returns string with ‘
‘ inserted before all newlines.
在代码中有注释如下:
/* it is really faster to scan twice and allocate mem once insted scanning once
and constantly reallocing */
程序先计算需要替换的个数,然后一次性计算需要分配的内存大小。从而减少了每次替换都重新分配内存的开销。
由此可见PHP源码的作者的程序优化上下了不少功夫。
源码摘抄如下:
str = Z_STRVAL_PP(zstr); // 字符串开始位置 end = str + Z_STRLEN_PP(zstr); // 字符串结束地址 /* it is really faster to scan twice and allocate mem once insted scanning once and constantly reallocing */ while (str < end) { // 计算需要替换的位置个数 if (*str == '\r') { if (*(str+1) == '\n') { str++; } repl_cnt++; } else if (*str == '\n') { if (*(str+1) == '\r') { str++; } repl_cnt++; } str++; } if (repl_cnt == 0) { // 如果没有可替换的字符串,直接返回 RETURN_STRINGL(Z_STRVAL_PP(zstr), Z_STRLEN_PP(zstr), 1); } // 给新生成的字符串分配内存 new_length = Z_STRLEN_PP(zstr) + repl_cnt * (sizeof("<br />") - 1); tmp = target = emalloc(new_length + 1); str = Z_STRVAL_PP(zstr); while (str < end) { switch (*str) { case '\r': // 没有break,直接转下个case case '\n': *target++ = '<'; *target++ = 'b'; *target++ = 'r'; *target++ = ' '; *target++ = '/'; *target++ = '>'; if ((*str == '\r' && *(str+1) == '\n') || (*str == '\n' && *(str+1) == '\r')) { *target++ = *str++; } /* lack of a break; is intentional */ default: *target++ = *str; } str++; } *target = '\0'; // 添加最后的结束字符 RETURN_STRINGL(tmp, new_length, 0); // 返回结果
ltrim — Strip whitespace (or other characters) from the beginning of a string
rtrim — Strip whitespace (or other characters) from the end of a string
trim — Strip whitespace (or other characters) from the beginning and end of a string
这三个函数都是调用static void php_do_trim(INTERNAL_FUNCTION_PARAMETERS, int mode)
===》PHPAPI char *php_trim(char *c, int len, char *what, int what_len, zval *return_value, int mode TSRMLS_DC)
实现,依据不同的mode(ltrim => 1, rtrim => 2, trim => 3)实现。
对于第二个参数,指过滤的字符,在默认情况下是 空格 \n\r\t\v\0
在程序中可以看到过滤用的字符仅有char mask[256];即ASCII 码的256个值
在使用php_charmask(unsigned char *input, int len, char *mask TSRMLS_DC)函数创建过滤用的字符HASH数组
如果是1或3(程序实现使用的是 mode & 1),则过滤源字符串前面的字符,从头开始遍历每个字符串,直接hash判断是否是需要过滤的字符,直到第一个不是过滤字符的位置结束
如果是2或 3(程序实现使用的是 mode & 2),则过滤源字符串后面的字符,过程与前面类似。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
浅谈PHP源码六:关于stream_get_wrappers函数
以上是淺談PHP源碼七:關於nl2br, ltrim, rtrim, trim函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

PHP会话对应用性能有显著影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版
中文版,非常好用

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。