如何在 PHP 中使用正则表达式转换标记 (\u \l \U \L \E)?

Posted

技术标签:

【中文标题】如何在 PHP 中使用正则表达式转换标记 (\\u \\l \\U \\L \\E)?【英文标题】:How can I use regex case convertion tokens (\u \l \U \L \E) in PHP?如何在 PHP 中使用正则表达式转换标记 (\u \l \U \L \E)? 【发布时间】:2021-05-29 08:01:17 【问题描述】:

我想让用户为 PHP preg_replace 函数提供模式和替换字符串。

此代码适用于我:

echo preg_replace('/(o)/', ', $1h!', 'hello'); // echoes 'hell, oh!'

替换字符串中的大小写转换标记,即\u\l\U\L\E,但对我不起作用。这是我尝试执行的代码示例:

echo preg_replace('/(o)/', '\u$1','hello'); // expected to echo 'hellO', echoes 'hell\uo'

由于替换字符串是动态的,我相信我无法使用回调函数而不是普通替换字符串来实现这种大小写转换功能。

这些是我尝试但无济于事的事情:

转义反斜杠导致此代码:

echo preg_replace('/(o)/u', '\\u$1','hello');

正则表达式修饰符/u 使代码看起来像这样。我不认为这会起作用,但我在某个地方读到过。尝试没有伤害:

echo preg_replace('/(o)/u', '\u$1','hello');

检查 regex101.com 上是否有任何相关信息,在这里您可以找到我试图在我的 php 代码中实现的功能:https://regex101.com/r/7VXijL/1。请注意左侧如何使用代码生成器来创建 PHP 代码。生成的代码对我来说与上面描述的问题完全相同(回声 The result of the substitution is hell\uo,即使我在 https://sandbox.onlinephpfunctions.com 上执行它)

目前的情况是我对自己的错误可能在哪里感到困惑:

    安装了错误的 PCRE 版本 以错误的方式使用 preg_replace 以错误的方式使用\u\l\U\L\E 是否可以使用 PHP 实现此功能(我使用的是 7.4.7)?

@1:如果 PCRE2 在某个时候突然重命名为 PCRE,我会感到非常困惑,因此我已经准备好了。我找不到任何关于在 Windows 下安装 PCRE2 for PHP 的信息。如果这是问题,我不介意使用带有 Linux 的虚拟机。以下是phpinfo(); 告诉我的关于我的 PCRE 的内容:

pcre
PCRE (Perl Compatible Regular Expressions) Support => enabled
PCRE Library Version => 10.34 2019-11-21
PCRE Unicode Version => 12.1.0
PCRE JIT Support => enabled
PCRE JIT Target => x86 64bit (little endian + unaligned)

@2&3:期待听到您的更正

@4:我或许可以通过 PHP 或者一些支持这种功能的命令工具来执行 Perl 脚本。这里有什么很酷的选择吗?

【问题讨论】:

我不认为preg_replace() 在替换字符串中实现了运算符。它使用 PCRE 进行匹配,但不替换。 @Barmar 我目前正在这里查看此参考:https://www.regular-expressions.info/refreplacecase.html。如果您从页面顶部的下拉列表中选择PCRE2,它将显示对我正在寻找的功能的某种支持。但是,它确实说“扩展”。不过我不知道这意味着什么。 从下拉列表中选择PHP,注意右栏全是“no”。 那么带有 PCRE v10.34 的 PHP 7.4.7 根本不支持它?我的问题是 https://www.regular-expressions.info/refreplacecase.html 没有指定任何特定的 PHP 版本,而 https://www.php.net/manual/en/pcre.installation.php 说 PHP 7.3+ 需要包含 PCRE2。 我在 PHP 文档中没有看到任何关于它的内容。替换字符串中唯一的动态值是第 n 个捕获组的 $n 【参考方案1】:

你不能在替换中使用函数,你必须使用preg_replace-callback。 regex101生成的代码是错误的。

$res = preg_replace_callback('/(o)/', 
    function ($m) 
        return strtoupper($m[1]);
    ,
    'hello'
);

echo $res;

输出:

hellO

【讨论】:

我对这个解决方案的问题是功能被硬编码到函数中。另一方面,我希望用户能够指定他想要大写(\U...\E\u)或小写(\L...\E\l)的匹配部分。长话短说,我似乎无法仅使用 PHP 来实现这一点。因此,我将创建另一个关于我的问题的问题并将其链接到此处。 @JennyHoweling:perl 实现可以完成这项工作。或者你可以解析正则表达式并重写一些可以被php使用的东西。

以上是关于如何在 PHP 中使用正则表达式转换标记 (\u \l \U \L \E)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式和 PHP 替换两个 HTML 标记之间的文本? [复制]

正则表达式删除所有空的 HTML 标记

PHP PHP:使用正则表达式从简介中删除锚点和其他标记

PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性。

如何将标准正则表达式转换为 php 正则表达式? [复制]

PHP正则表达式问题