【问题标题】:Changing text case using PHP regex functions使用 PHP 正则表达式函数更改文本大小写
【发布时间】:2014-07-08 11:19:06
【问题描述】:

我正在尝试实现客户要求,他们可以使用任意正则表达式来匹配任意文本中的模式,然后修改部分或全部匹配项的大小写。一个示例是 (sp)([\d]+),它是一个搜索表达式,用于查找字母组合“sp”后跟一个或多个数字的所有实例。相应的表达式将 sp 大写,如下所示:\U$1$2

我们通过一个 Web 界面实现对正则表达式的支持,该界面发布到一个 PHP 脚本,该脚本使用 preg_match() 和 preg_replace() PHP perl 兼容的正则表达式函数分别匹配和更改输入。

我尝试使用 preg_replace_callback 代替,因为它将匹配数组传递给您自己编写的回调,但问题是不知道匹配和替换模式,以及预先修改的输入文本,到目前为止我可以告诉我们,我们无法可靠地确定哪个匹配来自正则表达式的哪个组件,因此哪个匹配需要大写或小写。

有没有人尝试过类似的事情并取得了成功?

谢谢!

【问题讨论】:

  • 让客户定义自己的表达方式有点冒险。阅读ReDOS。如果这是一个选项,请尝试提供预定义的正则表达式。

标签: php regex


【解决方案1】:

类似的方法会起作用,您可以将匹配正则表达式的单词作为应用程序要求,但使用$match[0] 可以确保整个单词匹配都是大写的。

function _UpperCase_Preg_Matches($match){
    return strtoupper($match[0]);
}

$subject = "Item sp001 and item sp002 are good.";

print preg_replace_callback( "/\bsp\d+\b/i", _UpperCase_Preg_Matches, $subject);

输出:

Item SP001 and item SP002 are good.

在我构建的应用程序中,我们有一个用于大写单词的正则表达式,它采用一系列小规则并将它们全部连接在一起。

小规则类似于PC\d{6}LAP\d{6}SERV\d{3}。然后它们将在以下正则表达式/\b(?: rule1 | rule2 | rule3 )\b/i 中连接在一起。并且匹配被传递到回调中以大写。

【讨论】:

  • 感谢您的回复。问题是,我上面给出的正则表达式只是一个例子,我们需要能够处理任意正则表达式,我们不知道他们会提前使用什么。
  • 您可以让您的用户定义一个大写正则表达式和一个小写正则表达式,然后使用每个规则调用 preg_replace_callback。您可能试图过度设计您的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-05-23
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 2011-02-01
相关资源
最近更新 更多