


[PHP source code reading] strpos, strstr and stripos, stristr function, strposstristr_PHP tutorial
[PHP source code reading] strpos, strstr and stripos, stristr function, strposstristr
strpos
<span>mixed</span> <span>strpos</span> ( <span>string</span> <span>$haystack</span>, <span>mixed</span> <span>$needle</span> [, int <span>$offset</span> = 0 ] )
If offset is specified, the search will start from the offset position. offset cannot be negative.
Returns the position where needle first appeared in haystack. Returns FALSE if needle is not found in haystack.
needle, if needle is not a string, it will be converted to an integer value and assigned the ASCII character of the value. Please see the example below.
Example
<span>$str</span> = "hello"<span>; </span><span>$pos</span> = <span>strpos</span>(<span>$str</span>, 111<span>); </span><span>//</span><span> 111的ASCII值是o,因此$pos = 4</span>
strpos core source code
<span>if</span> (Z_TYPE_P(needle) ==<span> IS_STRING) { </span><span>if</span> (!<span>Z_STRLEN_P(needle)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, </span><span>"</span><span>Empty needle</span><span>"</span><span>); RETURN_FALSE; } </span><span>//</span><span> 调用php_memnstr函数查找needle</span> found = php_memnstr(haystack +<span> offset, Z_STRVAL_P(needle), Z_STRLEN_P(needle), haystack </span>+<span> haystack_len); } </span><span>else</span><span> { </span><span>//</span><span> 如果不是字符串,转换成数字并赋值为该数字的ASCII字符。</span> <span>if</span> (php_needle_char(needle, needle_char TSRMLS_CC) !=<span> SUCCESS) { RETURN_FALSE; } </span><span>//</span><span>设置结束字符</span> needle_char[<span>1</span>] = <span>0</span><span>; found </span>= php_memnstr(haystack +<span> offset, needle_char, </span><span>1</span><span>, haystack </span>+<span> haystack_len);<br /> } }</span>
One thing to note is that if needle is not a string, the php_needle_char function will be called to convert needle into an integer number and its ASCII value.
Find function
Thefunction finally returns found, and the php_memnstr function implements the search method. Then continue and see what the php_memnstr function does:
<span>#define</span> php_memnstr zend_memnstr
php_memnstr is the macro definition of the function zend_memnstr. View the zend_memnstr function as follows:
<span>static</span> inline <span>char</span> *<span> zend_memnstr(</span><span>char</span> *haystack, <span>char</span> *needle, <span>int</span> needle_len, <span>char</span> *<span>end) { </span><span>char</span> *p =<span> haystack; </span><span>char</span> ne = needle[needle_len-<span>1</span><span>]; </span><span>if</span> (needle_len == <span>1</span><span>) { </span><span>return</span> (<span>char</span> *)memchr(p, *needle, (end-<span>p)); } </span><span>if</span> (needle_len > end-<span>haystack) { </span><span>return</span><span> NULL; } </span><span>//</span><span> 第一个优化,只查找end - needle_len次</span> end -=<span> needle_len; </span><span>while</span> (p <=<span> end) { </span><span>//</span><span> 第二个优化,先判断字符串的开头和结尾是否一样再判断整个字符串</span> <span>if</span> ((p = (<span>char</span> *)memchr(p, *needle, (end-p+<span>1</span>))) && ne == p[needle_len-<span>1</span><span>]) { </span><span>if</span> (!memcmp(needle, p, needle_len-<span>1</span><span>)) { </span><span>return</span><span> p; } } </span><span>if</span> (p ==<span> NULL) { </span><span>return</span><span> NULL; } p</span>++<span>; } </span><span>return</span><span> NULL; }</span>
The first optimization, because (char *)memchr(p, *needle, (end-p 1) is searched in end - needle_len 1 (ie haystack_len 1), if p is empty, it means the first of needle characters
never appear in p.strstr
<span>string</span> <span>strstr</span> ( <span>string</span> <span>$haystack</span>, <span>mixed</span> <span>$needle</span> [, bool <span>$before_needle</span> = <span>false</span> ] )
Returns the string from the first occurrence of needle in haystack to the end.
This function is case-sensitive.
If needle does not exist in haystack, return FALSE.
If before_needle is true, return the string in haystack before the position where needle appears for the first time in haystack.
strstr core source code
<span>if</span><span> (found) { </span><span>//</span><span> 计算出found的位置</span> found_offset = found -<span> haystack; </span><span>if</span><span> (part) { RETURN_STRINGL(haystack, found_offset, </span><span>1</span><span>); } </span><span>else</span><span> { RETURN_STRINGL(found, haystack_len </span>- found_offset, <span>1</span><span>); } }</span>
The first half of the strstr function is similar to strpos. The difference is that after the strstr function finds the position, it needs to return the string in the haystack part. The part variable is the before_needle variable passed when calling the strstr function.
stripos
<span>mixed</span> <span>stripos</span> ( <span>string</span> <span>$haystack</span>, <span>string</span> <span>$needle</span> [, int <span>$offset</span> = 0 ] )
Case-insensitive strpos. The implementation method is similar to the one below, mainly using a copy and converting the strings to be compared into lowercase characters before searching.
stristr
<span>string</span> <span>stristr</span> ( <span>string</span> <span>$haystack</span>, <span>mixed</span> <span>$needle</span> [, bool <span>$before_needle</span> = <span>false</span> ] )
Case-insensitive strstr.
Core source code
<span>//</span><span> 拷贝一份haystack</span> haystack_dup =<span> estrndup(haystack, haystack_len); </span><span>if</span> (Z_TYPE_P(needle) ==<span> IS_STRING) { </span><span>char</span> *<span>orig_needle; </span><span>if</span> (!<span>Z_STRLEN_P(needle)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, </span><span>"</span><span>Empty needle</span><span>"</span><span>); efree(haystack_dup); RETURN_FALSE; } orig_needle </span>=<span> estrndup(Z_STRVAL_P(needle), Z_STRLEN_P(needle)); </span><span>//</span><span> 调用php_stristr函数找出orig_needle的值。</span> found =<span> php_stristr(haystack_dup, orig_needle, haystack_len, Z_STRLEN_P(needle)); efree(orig_needle); } </span><span>else</span><span> { </span><span>if</span> (php_needle_char(needle, needle_char TSRMLS_CC) !=<span> SUCCESS) { efree(haystack_dup); RETURN_FALSE; } needle_char[</span><span>1</span>] = <span>0</span><span>; found </span>= php_stristr(haystack_dup, needle_char, haystack_len, <span>1</span><span>); } </span><span>if</span><span> (found) { found_offset </span>= found -<span> haystack_dup; </span><span>if</span><span> (part) { RETVAL_STRINGL(haystack, found_offset, </span><span>1</span><span>); } </span><span>else</span><span> { RETVAL_STRINGL(haystack </span>+ found_offset, haystack_len - found_offset, <span>1</span><span>); } } </span><span>else</span><span> { RETVAL_FALSE; } </span><span>//</span><span> 释放变量</span> efree(haystack_dup);
You can know that found is obtained from php_stristr. Continue to view the php_stristr function:
PHPAPI <span>char</span> *php_stristr(<span>char</span> *s, <span>char</span> *<span>t, size_t s_len, size_t t_len) { php_strtolower(s, s_len); php_strtolower(t, t_len); </span><span>return</span> php_memnstr(s, t, t_len, s +<span> s_len); }</span>
The function of this function is to convert the string into lowercase and then call the php_mennstr function to find the position where needle first appears in haystack.
Summary
Because strpos/stripos returns the position, and the position is calculated from 0, it is more suitable to use === FALSE when judging the search failure.
There is a lot to gain from reading the source code of PHP. On the one hand, you can know the specific implementation principle of a certain function, and on the other hand, you can learn some programming optimization solutions.
This is the end of this article. If you still have any questions or suggestions, you can communicate more. It is an original article. The writing style is limited and the talent is shallow. If there is anything wrong in the article, please let me know.
If this article is helpful to you, please click and recommend, thank you^_^

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Detailed explanation of the method of converting int type to string in PHP In PHP development, we often encounter the need to convert int type to string type. This conversion can be achieved in a variety of ways. This article will introduce several common methods in detail, with specific code examples to help readers better understand. 1. Use PHP’s built-in function strval(). PHP provides a built-in function strval() that can convert variables of different types into string types. When we need to convert int type to string type,

How to check if a string starts with a specific character in Golang? When programming in Golang, you often encounter situations where you need to check whether a string begins with a specific character. To meet this requirement, we can use the functions provided by the strings package in Golang to achieve this. Next, we will introduce in detail how to use Golang to check whether a string starts with a specific character, with specific code examples. In Golang, we can use HasPrefix from the strings package

Title: How to determine whether a string ends with a specific character in Golang. In the Go language, sometimes we need to determine whether a string ends with a specific character. This is very common when processing strings. This article will introduce how to use the Go language to implement this function, and provide code examples for your reference. First, let's take a look at how to determine whether a string ends with a specified character in Golang. The characters in a string in Golang can be obtained through indexing, and the length of the string can be

1. First open pycharm and enter the pycharm homepage. 2. Then create a new python script, right-click - click new - click pythonfile. 3. Enter a string, code: s="-". 4. Then you need to repeat the symbols in the string 20 times, code: s1=s*20. 5. Enter the print output code, code: print(s1). 6. Finally run the script and you will see our return value at the bottom: - repeated 20 times.

Methods to solve Chinese garbled characters when converting hexadecimal strings in PHP. In PHP programming, sometimes we encounter situations where we need to convert strings represented by hexadecimal into normal Chinese characters. However, in the process of this conversion, sometimes you will encounter the problem of Chinese garbled characters. This article will provide you with a method to solve the problem of Chinese garbled characters when converting hexadecimal to string in PHP, and give specific code examples. Use the hex2bin() function for hexadecimal conversion. PHP’s built-in hex2bin() function can convert 1

PHP String Matching Tips: Avoid Ambiguous Included Expressions In PHP development, string matching is a common task, usually used to find specific text content or to verify the format of input. However, sometimes we need to avoid using ambiguous inclusion expressions to ensure match accuracy. This article will introduce some techniques to avoid ambiguous inclusion expressions when doing string matching in PHP, and provide specific code examples. Use preg_match() function for exact matching In PHP, you can use preg_mat

PHP String Operation: A Practical Method to Effectively Remove Spaces In PHP development, you often encounter situations where you need to remove spaces from a string. Removing spaces can make the string cleaner and facilitate subsequent data processing and display. This article will introduce several effective and practical methods for removing spaces, and attach specific code examples. Method 1: Use the PHP built-in function trim(). The PHP built-in function trim() can remove spaces at both ends of the string (including spaces, tabs, newlines, etc.). It is very convenient and easy to use.

As a scripting language widely used to develop web applications, PHP has very powerful string processing functions. In daily development, we often encounter operations that require deleting a string, especially the last two characters of the string. This article will introduce two PHP techniques for deleting the last two characters of a string and provide specific code examples. Tip 1: Use the substr function The substr function in PHP is used to return a part of a string. We can easily remove characters by specifying the string and starting position
