当前位置:首页 > PHP

php strpos源码实现

2026-02-16 06:10:30PHP

PHP strpos 源码实现分析

PHP 的 strpos 函数用于查找字符串中子字符串首次出现的位置。其底层实现基于 C 语言,核心逻辑在 PHP 源码的 ext/standard/string.c 文件中。

函数原型

strpos 的 C 语言实现原型如下:

PHP_FUNCTION(strpos)
{
    zend_string *haystack;
    zend_string *needle;
    zend_long offset = 0;
    zend_bool strict = 0;

    ZEND_PARSE_PARAMETERS_START(2, 3)
        Z_PARAM_STR(haystack)
        Z_PARAM_STR(needle)
        Z_PARAM_OPTIONAL
        Z_PARAM_LONG(offset)
        Z_PARAM_BOOL(strict)
    ZEND_PARSE_PARAMETERS_END();

    // 核心查找逻辑
    php_strpos_impl(return_value, haystack, needle, offset, strict);
}

核心查找逻辑

php_strpos_impl 是实际执行查找的函数:

php strpos源码实现

static void php_strpos_impl(
    zval *return_value, 
    zend_string *haystack, 
    zend_string *needle, 
    zend_long offset, 
    zend_bool strict
) {
    const char *p, *e;
    char *r;
    size_t haystack_len = ZSTR_LEN(haystack);
    size_t needle_len = ZSTR_LEN(needle);

    // 边界检查
    if (needle_len == 0) {
        php_error_docref(NULL, E_WARNING, "Empty needle");
        RETURN_FALSE;
    }

    if (offset < 0) {
        offset += haystack_len;
    }

    if (offset < 0 || (size_t)offset > haystack_len) {
        php_error_docref(NULL, E_WARNING, "Offset not contained in string");
        RETURN_FALSE;
    }

    // 实际字符串匹配
    p = ZSTR_VAL(haystack) + offset;
    e = ZSTR_VAL(haystack) + haystack_len;
    r = php_memnstr(p, ZSTR_VAL(needle), needle_len, e);

    if (r) {
        RETURN_LONG(r - ZSTR_VAL(haystack));
    } else {
        RETURN_FALSE;
    }
}

关键点说明

  1. 参数处理:解析输入参数,包括目标字符串 haystack、查找字符串 needle、起始偏移量 offset 和严格模式标志 strict

  2. 边界检查:验证 needle 非空,检查 offset 是否在有效范围内。负偏移量会从字符串末尾开始计算。

    php strpos源码实现

  3. 字符串匹配:使用 php_memnstr 函数执行实际的字符串匹配。该函数类似于标准 C 的 memmem,但针对 PHP 进行了优化。

  4. 结果返回:找到匹配时返回位置(字节偏移量),否则返回 false

性能优化

PHP 的字符串查找实现经过高度优化:

  • 对于短字符串使用简单线性搜索。
  • 对于较长字符串可能采用更高效的算法(如 Boyer-Moore 的变种)。
  • 直接操作内存字节,避免不必要的编码转换。

编码处理

strpos 是二进制安全的,不关心字符串编码。对于多字节字符(如 UTF-8),应使用 mb_strpos 函数。

标签: 源码php
分享给朋友:

相关文章

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/t…

php实现下载

php实现下载

PHP实现文件下载 使用PHP实现文件下载可以通过设置HTTP头部信息强制浏览器下载文件而非直接打开。以下是几种常见的方法: 方法一:直接输出文件内容 $file_path = 'path/to/…

php实现一个

php实现一个

PHP 实现一个简单的计算器 创建一个基本的计算器,支持加、减、乘、除运算。以下是一个完整的实现代码示例: <?php $result = ""; if ($_SERVER["REQUEST_…

php实现域名

php实现域名

PHP实现域名操作的方法 获取当前域名 使用$_SERVER['HTTP_HOST']可以获取当前访问的域名: $currentDomain = $_SERVER['HTTP_HOST']; ech…

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…