当前位置:首页 > 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 是实际执行查找的函数:

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 是否在有效范围内。负偏移量会从字符串末尾开始计算。

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

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

性能优化

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

php strpos源码实现

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

编码处理

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

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

相关文章

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php mvc实现

php mvc实现

PHP MVC 实现步骤 模型(Model)层 模型负责数据处理和业务逻辑,通常与数据库交互。创建一个基类模型,其他具体模型继承它。 class Model { protected $db;…

php实现支付宝支付

php实现支付宝支付

支付宝支付集成步骤 准备工作 在开始集成支付宝支付前,确保已注册支付宝开放平台账号并完成企业实名认证。创建应用后获取APPID、应用私钥和支付宝公钥。 配置支付宝SDK 通过Composer安装支付…

php 路由实现的

php 路由实现的

PHP 路由实现方法 基于原生 PHP 实现路由 创建一个简单的路由解析器,通过解析 URL 路径来调用对应的控制器或函数。 // 定义路由表 $routes = [ '/' => '…

php 实现聊天功能

php 实现聊天功能

PHP 实现聊天功能的方法 使用 WebSocket 和 Ratchet 库 WebSocket 是实现实时聊天的理想选择。Ratchet 是一个 PHP 库,用于处理 WebSocket 连接。…