当前位置:首页 > 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 的字符串查找实现经过高度优化:

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

编码处理

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

php strpos源码实现

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

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'loca…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

uniapp项目源码

uniapp项目源码

Uniapp 项目源码获取方式 官方示例与模板 Uniapp 官方提供了多个开源项目模板和示例,涵盖基础框架、UI组件库等。可通过以下途径获取: 在 DCloud 插件市场 搜索“uniapp…

php 实现队列

php 实现队列

PHP 实现队列的方法 PHP 可以通过多种方式实现队列功能,以下是几种常见的实现方法: 使用数组实现队列 PHP 数组可以通过 array_push 和 array_shift 函数模拟队列的先…