在 PHP 中,将冒号左边的每个字母小写,不使用爆炸、内爆

发布于 2024-08-14 04:55:23 字数 140 浏览 4 评论 0原文

这可以用正则表达式来完成吗?

示例

x-example-HEADER:teSt 变成 x-example-header:测试

y-example:testoneTWO Three 变成 y-示例:testoneTWO三

Can this be done with regular expressions?

Examples

x-example-HEADER:teSt
becomes
x-example-header:teSt

y-exaMPLE:testoneTWOthree
becomes
y-example:testoneTWOthree

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

萌吟 2024-08-21 04:55:23

使用 preg_replace_callback()

$output = preg_replace_callback('![a-zA-Z]+:!', 'to_lower', $input);

function to_lower($matches) {
  return strtolower($matches[0]);
}

除特定情况外,您不能使用正则表达式进行大小写转换(例如,可以将“A”替换为“a”)。

编辑:好吧,你每天都会学到新东西。您可以这样做:

$output = preg_replace('![a-zA-Z]+:!e', "strtoupper('\\1')", $input);

模式修饰符

e (PREG_REPLACE_EVAL)

如果设置了此修饰符,
preg_replace() 正常
替换中的反向引用
替换字符串,将其计算为
PHP 代码,并将结果用于
替换搜索字符串。单身的
引号、双引号、反斜杠 ()
并且 NULL 字符将被转义
替换中的反斜杠
反向引用。

只有preg_replace()使用这个
修饰符;它被其他 PCRE 忽略
功能。

然而,我会回避 eval()ing 字符串,尤其是与用户输入结合使用时,这可能是一种非常危险的做法。作为一般规则,我更喜欢使用 preg_replace_callback() 方法。

Use preg_replace_callback():

$output = preg_replace_callback('![a-zA-Z]+:!', 'to_lower', $input);

function to_lower($matches) {
  return strtolower($matches[0]);
}

You can't otherwise do case conversion with regular expressions except in specific cases (eg replace 'A' with 'a' is possible).

Edit: Ok, you learn something new everyday. You can do this:

$output = preg_replace('![a-zA-Z]+:!e', "strtoupper('\\1')", $input);

From Pattern Modifiers:

e (PREG_REPLACE_EVAL)

If this modifier is set,
preg_replace() does normal
substitution of backreferences in the
replacement string, evaluates it as
PHP code, and uses the result for
replacing the search string. Single
quotes, double quotes, backslashes ()
and NULL chars will be escaped by
backslashes in substituted
backreferences.

Only preg_replace() uses this
modifier; it is ignored by other PCRE
functions.

I would however shy away from eval()ing strings, especially when combined with user input it can be a very dangerous practice. I would prefer the preg_replace_callback() approach as a general rule.

染年凉城似染瑾 2024-08-21 04:55:23

您可以使用 e 修饰符< /a> 当给 preg_replace< 时使用正则表达式模式/code>(查看该页面上的示例 #4),以便调用 PHP 代码作为替换的一部分:

$string = "x-example-HEADER:teSt";
$new_string = preg_replace('/(^.+)(?=:)/e', "strtolower('\\1')", $string);
// => x-example-header:teSt

该模式会将第一个冒号之前的所有内容抓取到第一个反向引用中,然后将其替换为strtolower 函数。

You can use the e modifier on a regular expression pattern when given to preg_replace (take a look at example #4 on that page) in order to call PHP code as part of the replacement:

$string = "x-example-HEADER:teSt";
$new_string = preg_replace('/(^.+)(?=:)/e', "strtolower('\\1')", $string);
// => x-example-header:teSt

The pattern will grab everything before the first colon into the first backreference, and then replace it with the strtolower function.

忆离笙 2024-08-21 04:55:23

您可以查看 preg_replace_callback

You might take a look at preg_replace_callback

咽泪装欢 2024-08-21 04:55:23
$str = 'y-exaMPLE:testoneTWOthree';
function lower( $str ) {
    return strtolower( $str[1] );
}

echo preg_replace_callback( '~^([^:]+)~', 'lower', $str );
$str = 'y-exaMPLE:testoneTWOthree';
function lower( $str ) {
    return strtolower( $str[1] );
}

echo preg_replace_callback( '~^([^:]+)~', 'lower', $str );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文