PHP mb_split(),捕获分隔符

2024-03-22

preg_split有一个可选的PREG_SPLIT_DELIM_CAPTUREflag,它还返回返回数组中的所有分隔符。mb_split才不是。

有没有办法分割多字节字符串(不仅仅是UTF-8,而是所有类型)并捕获分隔符?

我正在尝试制作一个多字节安全的换行符拆分器,保留换行符,但更喜欢更通用的可用解决方案。

Solution感谢用户 Casimir et Hippolyte,我构建了一个解决方案并将其发布到 github 上 (https://github.com/vanderlee/PHP-multibyte-functions/blob/master/functions/mb_explode.php https://github.com/vanderlee/PHP-multibyte-functions/blob/master/functions/mb_explode.php),它允许所有 preg_split 标志:

/**
 * A cross between mb_split and preg_split, adding the preg_split flags
 * to mb_split.
 * @param string $pattern
 * @param string $string
 * @param int $limit
 * @param int $flags
 * @return array
 */
function mb_explode($pattern, $string, $limit = -1, $flags = 0) {       
    $strlen = strlen($string);      // bytes!   
    mb_ereg_search_init($string);

    $lengths = array();
    $position = 0;
    while (($array = mb_ereg_search_pos($pattern)) !== false) {
        // capture split
        $lengths[] = array($array[0] - $position, false, null);

        // move position
        $position = $array[0] + $array[1];

        // capture delimiter
        $regs = mb_ereg_search_getregs();           
        $lengths[] = array($array[1], true, isset($regs[1]) && $regs[1]);

        // Continue on?
        if ($position >= $strlen) {
            break;
        }           
    }

    // Add last bit, if not ending with split
    $lengths[] = array($strlen - $position, false, null);

    // Substrings
    $parts = array();
    $position = 0;      
    $count = 1;
    foreach ($lengths as $length) {
        $is_delimiter   = $length[1];
        $is_captured    = $length[2];

        if ($limit > 0 && !$is_delimiter && ($length[0] || ~$flags & PREG_SPLIT_NO_EMPTY) && ++$count > $limit) {
            if ($length[0] > 0 || ~$flags & PREG_SPLIT_NO_EMPTY) {          
                $parts[]    = $flags & PREG_SPLIT_OFFSET_CAPTURE
                            ? array(mb_strcut($string, $position), $position)
                            : mb_strcut($string, $position);                
            }
            break;
        } elseif ((!$is_delimiter || ($flags & PREG_SPLIT_DELIM_CAPTURE && $is_captured))
               && ($length[0] || ~$flags & PREG_SPLIT_NO_EMPTY)) {
            $parts[]    = $flags & PREG_SPLIT_OFFSET_CAPTURE
                        ? array(mb_strcut($string, $position, $length[0]), $position)
                        : mb_strcut($string, $position, $length[0]);
        }

        $position += $length[0];
    }

    return $parts;
}

捕获分隔符只能用preg_split并且在其他功能中不可用。

那么三种可能:

1)将您的字符串转换为 UTF8,使用preg_split with PREG_SPLIT_DELIM_CAPTURE,并使用array_map将每个项目转换为原始编码。

这种方式比较简单。第二种方式则不然。(请注意,一般来说,始终使用 UTF8 工作比处理外来编码更简单)

2)代替一个分裂状例如您需要使用的功能mb_ereg_search_regs http://php.net/manual/en/function.mb-ereg-search-regs.php获取匹配的部分并构建如下所示的模式:

delimiter|all_that_is_not_the_delimiter

(请注意,交替的两个分支必须是互斥的,并且要小心地以一种不会在结果之间产生间隙的方式编写它们。第一部分必须位于字符串的开头,最后一部分必须位于字符串的末尾。每个部分必须与前一个部分相邻,依此类推。)

3) use mb_split with 环顾四周 http://www.regular-expressions.info/lookaround.html。根据定义,环视是零宽度断言,不匹配任何字符,只匹配字符串中的位置。因此,您可以使用这种匹配分隔符之后或之前的位置的模式:

(?=delimiter)|(<=delimiter)

(这种方式的限制是lookbehind中的子模式不能具有可变长度(换句话说,不能在内部使用量词),但它可以是固定长度子模式的交替:(?<=subpat1|subpat2|subpat3) )

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP mb_split(),捕获分隔符 的相关文章

  • 如何在php项目中使用Piwik设备检测器?

    我想用php 设备检测器 https github com piwik device detector这是著名的 Piwik 项目的一部分 但我不明白如何在我的 php 代码中包含和使用该代码 我不想使用作曲家 I wrote
  • 插入值数组

    我有一个具有可变数量值的数组 除了内部带有查询的循环之外 是否有更有效或更好的方法将它们插入到我的数据库中 At 这个网站 http www desilva biz mysql insert html 有一个很好的 MySQL 多插入查询示
  • XPath 直到下一个标签

    与之前在这里问过的其他人类似的问题 但由于我不知道如何应用这些建议 所以我需要一些帮助 我想找到一个 html 文档的节点 其结构如下 摘录 可能有所不同 h2 My title 1 h2 h3 Sub heading h3 p span
  • 从 WordPress 搜索结果页面获取类别名称

    在特定博客类别中进行搜索查询 重定向到 WP BLOG 主页面 后 我的搜索 URL 如下所示 online shop s category new posts category post type post 不幸的是 我无法在搜索结果页面
  • PHP/MySQL/jQuery 记录的悲观锁定

    我一直在考虑为我参与的应用程序开发一些简单的记录锁定 有一些用户实际上需要花费几个小时才能完成记录的编辑 当其他人想要更改记录时 这会导致问题 目前不涉及锁定 我不确定乐观锁定在我的情况下是否可靠 因为记录是通过 AJAX 请求保存的 我正
  • 来自同一数组的引用键

    我试图引用同一数组中项目的键 值对 glossary args array name gt Glossary Terms singular name gt Glossary Term add new gt Add New Term edit
  • 我可以使用开发者密钥通过 Google Sheets API 无需 Oauth 向 Google Sheet 写入数据吗?

    我正在开发一个使用 Google Sheets API 读取和更新 Google 电子表格中的值的应用程序 我可以使用我的开发人员密钥进行读取 但是尝试写入会返回此错误 请求缺少所需的身份验证凭据 需要 OAuth 2 访问令牌 登录 co
  • 如何用单引号替换双引号

    我该如何更换 我认为这称为双引号 我认为它称为单引号 使用 PHP str replace text 或重新分配它 text str replace text
  • PHP 正则表达式修复被黑的 WordPress 网站

    我有一个客户安装了多个 WordPress 但他没有保持最新状态 结果 他被黑了 当我试图找出黑客是如何进入并永久解决问题时 我正在尝试创建一个脚本来快速 自动地修复它们 我找到了这个脚本 它可以满足我的要求 http designpx c
  • 如何应对本地化?我应该遵循一个标准吗?

    我正在尝试创建一组类来处理本地化 主要是货币部分 但也包括语言 我可以想象其中的逻辑 但我不知道不同的语言和货币使用什么名称 我看到有很多 ISO 标准 我应该选择哪一个 不管怎样 这是我想到的逻辑 以防你也能帮忙解决这个问题 我会有一个
  • YOUTUBE API:检索视频关键字

    最近 YouTube 决定仅向经过身份验证的开发者输出视频关键字 我注册了开发者密钥 我试图获取一个我将解析的 XML 通过请求 https gdata youtube com feeds api videos COwIYbYQUrQ ke
  • Laravel 4 - 工匠错误 SQLSTATE[42000]

    我正在尝试为我的用户表创建一个新的迁移 我有以下架构 Schema create users function t t gt increments id t gt string username 16 t gt string passwor
  • 在 CodeIgniter 中使用 ajax 时出现 403 禁止错误

    我正在显示我的名字textbox使用 ajax 自动完成 但我的 ajax URL 不起作用 每次都显示在网络选项卡中 403 禁止 我尝试过像这样的ajax URL url baseUrl index php Employee contr
  • 如何在 Mac 上更改 PHP-FPM 端口

    我没有使用 php 或 php fpm 但它占用了端口 9000 我需要端口 9000 我想更改端口 我把它改成了 etc php fpm conf and etc php fpm d www conf 听 127 0 0 1 9005 仍
  • 仅显示帖子的子类别

    我有一个自定义帖子 我想显示它所属的所有类别 这有两个部分 在页面顶部 我只显示它所属的顶级类别 这就是我的做法 div class type block span class type initial span div
  • 从 PHP/Web 应用程序打印多个标签到 Dymo LabelWriter 450 Turbo

    我希望添加使用 Dymo LabelWriter 450 Turbo 打印多个标签的功能 我已经从 Dymo 网站下载了 DYMO Label v 8 SDK dmg 但看不到任何 Javascript Web 相关的 SDK 文件或文档
  • 无法加载 php_curl

    我已经在WindowsXp上安装了php5 2 13 apache2 2 15 将C php添加到PATH ssystem变量中 我无法启用卷曲扩展 我配置了extension dir并删除了 在 php ini 中形成 php curl
  • PHP md5() 给出与 MySQL md5 不同的输出

    我正在尝试设置登录系统 但无法解决一个问题 PHP 通过 md5 给了我另一个输出 比MySQL 例如 在 PHP 中 password md5 brickmasterj return password 返回 3aa7b18f304e2e2
  • /etc/php5/conf.d 文件夹中的 .ini 文件有什么用?

    我知道 ini 文件位于 etc php5 cli与 PHP 的 CLI 使用有关 文件位于 etc php5 fpm是关于 PHP 的 FastCGI FPM 方面 但是位于以下位置的 ini 文件又如何呢 etc php5 conf d
  • 针对 Woocommerce 中多个产品类别计数的 ajax 添加到购物车的 JS 警报

    在 Woocommerce 中 当达到特定产品类别的购物车中的产品的特定数量时 我尝试显示 JavaScript 甜蜜警报 并在达到二级类别的产品的特定数量时显示另一个警报 商品通过 AJAX 添加到购物车 这就是我想使用 JavaScri

随机推荐

  • 当配置文件未激活时包括 Bean 定义

    在我的应用程序中我使用了几个profiles http blog springsource com 2011 02 14 spring 3 1 m1 introducing profile 使某些 bean 适合自动装配 我缺少的是当某个配
  • mysqli_num_rows 无论如何都会返回 1 [重复]

    这个问题在这里已经有答案了 当我在 phpMyAdmin 中进行 SQL 搜索 用变量替换实际值 时 它会返回正确的行号 但是当使用 PHP 返回该值时 无论如何它总是返回 1 提前致谢 function user exists usern
  • 如何为钩子创建蹦床函数

    我对挂钩很感兴趣 我决定看看是否可以挂钩一些函数 我对使用 detours 这样的库不感兴趣 因为我想拥有自己做的经验 通过我在互联网上找到的一些资源 我能够创建下面的代码 这是基本的 但效果还不错 然而 当挂钩由多个线程调用的函数时 它被
  • 寻找在本地磁盘上存储数据的想法

    我在 XML 文件中存储了大量数据 大小为 173 MB 460 万行 并将其存储在 Windows 窗体应用程序的工作目录中 它是将数据表写入 XML 文件的结果 数据表最初是通过对 SQL 服务器的查询填充的 我将其存储在本地而不是从服
  • 使用 apache tika 获取 doc 文件中的嵌入资源

    我有包含文本和图像的 MS Word 文档 我想解析它们以获得 xml 结构 经过研究 我最终使用 apache tika 来转换我的文档 我可以将我的文档解析为 xml 这是我的代码 AutoDetectParser parser new
  • AVPlayerStatus 与 AVPlayerItemStatus

    问题是玩家状态返回AVPlayerStatusReadyToPlay在player currentItem status返回之前整整2秒AVPlayerItemStatusReadyToPlay 有人对为什么会发生这种情况有任何有用的解释吗
  • 通过类构造函数初始化成员变量STL向量

    我有以下代码似乎可以工作 class MapCell public int x y z void Test3DVector int size x int size y int size z vector lt vector lt vecto
  • 如何测试 Phoenix 套接字是否已终止?

    我正在寻找一种方法来测试套接字是否被终止 被测试的代码执行以下操作 def handle in logout payload socket do stop logout socket gt assign user nil end 和我的测试
  • Apache 反向代理 https 到 http

    我已经在这里和互联网上进行了大量的浏览 但我无法配置我的 apache 将 https 反向代理为 http 不过我觉得我已经很接近了 我遵循的所有示例似乎都适用于除我之外的每个人 而且我的设置非常简单
  • RuntimeError:应用程序“目录”中的“product_product_options”模型发生冲突

    版本信息 Python 3 4 Django 1 8 Oscar Commerce 版本 1 2 1 最终 我正在尝试定制Products在目录应用程序中文档 http django oscar readthedocs io en rele
  • 关于雪花中 util_db 的任何好的文档

    我正在寻找有关雪花中 util db 用途的信息 该帐户随数据库一起提供 找不到这方面的好的文档 UTIL DB 是初始帐户设置的一部分 包含一些用于加载数据的示例文件格式 这不使用任何数据存储 因此不会对您的帐户产生存储费用 如果需要 帐
  • 将实体框架代码优先中的 SQL Server 数据库字母列排序更改为顺序

    我需要首先关闭代码中的字母顺序 这是我的简化课程 public class Person Key Column PersonId public int Id get set MaxLength 50 public string Person
  • 无法使用 Az DevOps Pipelines API 6.0-preview.1 创建新管道

    我正在尝试使用此 API 端点创建新的管道 POST https dev azure com organization project apis pipelines api version 6 0 preview 1 https dev a
  • 如何设置表单下拉列表的样式?

    我在互联网上进行了广泛的搜索 但没有找到任何关于如何在表单中设置下拉列表的下拉部分样式的有用信息 我希望能指出正确的方向 谢谢 我已经研究同样的问题有一段时间了 想出了一个非常简单的解决方案 使用比下拉列表本身更短的保持器 div 我还使用
  • 如何判断 /bin/sh 中的文件是否早于 30 分钟?

    如何编写脚本来确定 bin sh 中的文件是否早于 30 分钟 不幸的是没有stat系统中存在命令 这是一个古老的Unix系统 http en wikipedia org wiki Interactive Unix http en wiki
  • 如何填充 C++ 字符串中的一个部分?

    有一个空格字符串 string str new string str gt resize width 我想 在某个位置填充长度字符 在C中它看起来像 memset str pos length 我如何用 C 字符串实现这一点 我尝试过 st
  • MySQL 按月和年过滤结果

    我的表格显示了各个国家 地区的搜索量以及搜索日期 我想要一个查询来显示 2012 年和 2013 年每个月的搜索量 我需要为月份添加单独的列 年份和搜索次数 我之前使用过下面的查询 该查询返回每周的搜索量 但我想将其更改为仅 2012 年和
  • 如何在maven 2中指定一串目标作为defaultGoal?

    我只是好奇 有没有办法指定您希望将一串目标作为 Maven 项目中的默认目标运行 有没有类似蚂蚁的
  • C# .net cf 中的 nmea 校验和

    我正在尝试编写自己的 nmea 解析器 因为我只需要来自 GPS 的一些信息 并且不需要解释所有消息 我遇到的问题是我的 nmea 消息验证器给了我一个错误的校验和 有人能看到我做错了什么吗 我正在使用这个想法Codepedia 计算和验证
  • PHP mb_split(),捕获分隔符

    preg split有一个可选的PREG SPLIT DELIM CAPTUREflag 它还返回返回数组中的所有分隔符 mb split才不是 有没有办法分割多字节字符串 不仅仅是UTF 8 而是所有类型 并捕获分隔符 我正在尝试制作一个