0

PHP 的strlen()函数不支持 UTF-8,因此我想将每个用法strlen()与支持 UTF-8 的对应项交换:mb_strlen(). 但是,mb_strlen()需要一个额外的参数:

$length = strlen($someString);
$length = mb_strlen($someString, 'UTF-8');

如果没有第二个参数,一个简单的 Perl 正则表达式将处理交换:

$ find . -name '*' -print0 | xargs -0 perl -pi -e 's/strlen/mb_strlen/g'

我尝试使用捕获组和反向引用,但 VIM 样式的语法要么不支持(在最近的 Ubuntu 上),要么我无法弄清楚。我已经尝试了几种变体但没有成功:

$ find . -name '*' -print0 | xargs -0 perl -pi -e 's/strlen\((\.*)\)/mb_strlen\($1, "UTF-8"\)/g'

此外,可能有诸如trim()inside之类的函数,strlen()所以我必须使这个贪婪,但我不确定贪婪的运算符应该准确地去哪里。这个正则表达式应该怎么写?

4

4 回答 4

1

这比最初看起来要困难得多。您要么需要:

  1. 正确解析表达式,包括表达式的多行版本。
  2. 欺骗

我会去作弊。

大多数 strlen() 调用将非常简单,剩下的少数可以手动替换。而且您是在某种版本控制下执行此操作的,不是吗:

简单:strlen("foo"), strlen($bar)

# Match simple quoted strings - no embedded quotes
s/strlen\((["'][^"']*["'])\)/mb_strlen($1, 'UTF-8')/g
# Match simple variables - no method calls etc
s/strlen\((\$\w+)\)/mb_strlen($1, 'UTF-8')/g

处理数组变量、函数和方法调用以及其他表达式变得更加复杂,但是看看在这两个基本替换之后还剩下多少。

于 2013-02-01T09:08:26.080 回答
0

在一般情况下,使用简单的正则表达式无法解决您的问题。考虑这些例子:

if (strlen($var) > 0)

$total_length = strlen($thing1) + strlen($thing2);

strlen($var);   #Don't use trim() here because it was already trimmed.

some_other_function(strlen($foo) + 2);

这些都不适用于您的正则表达式,因为.*会贪婪地捕获所有内容,直到该行中的最后一个右括号。正确执行此操作的唯一方法是检查平衡括号,这在正则表达式中并非易事(尽管在技术上可以使用 Perl 的扩展正则表达式功能,但这绝非易事)。

如果您认为不会遇到上述很多情况,那么只需使用其他建议的解决方案之一并检查错误。或者你可以这样做来捕捉所有没有括号的简单案例:

s/\bstrlen\(([^()]*)\)/mb_strlen($1, "UTF-8")/g

(注意,我还添加\b以确保它从单词边界开始。这将阻止您双重替换已经存在的东西mb_strlen

但是,有一个适用于所有情况的简单快速破解解决方案:创建您自己的名为 的 PHP 函数my_mb_strlen,或者mb_strlen在添加附加参数时调用的其他函数。然后,您可以只对函数名称执行更简单的搜索和替换,替换strlenmy_mb_strlen.

于 2013-02-01T09:13:58.290 回答
0
find . -type f|xargs perl -pi -e 's/strlen\(([^\)]*)\)/mb_strlen($1,'UTF_8')/g'
于 2013-02-01T10:00:29.107 回答
0

通过指定\.*,正则表达式将匹配 0 个或多个文字'.'s。

省略后尝试\

s/strlen\((.*)\)/mb_strlen($1, "UTF-8")/g
           ^              ^           ^
           NO BACKSLASH   NO BACKSLASH NEEDED
                          AS THIS IS TREATED AS
                          A STRING AND NOT A REGEX

此外,请先尝试在没有-i标志的情况下对其进行测试,以确保您对替换感到满意,否则您的文件将被原位修改。

于 2013-02-01T08:12:36.483 回答