【发布时间】:2017-10-07 20:37:36
【问题描述】:
我正在处理一些非常混乱的 Excel 表格,并尝试使用 PHP 来寻找线索..
我有一个 MySQL 数据库,其中包含 excel 文档中的所有公式,并且像往常一样,当前工作表中的单元格名称没有“工作表名称!”在它面前。为了使其可搜索(并在公式中找到死路),我喜欢将数据库中的所有公式替换为其工作表名称作为前缀。
例子:
=+(sheet_factory_costs!A17/sheet_employees!D23)+T12+W12
数据库包含当前工作表的名称,我喜欢用该工作表名称更改上面的公式(我们称之为“sheet_turnover”)。
=+(sheet_factory_costs!A17 / sheet_employees!D23)+sheet_turnover!T12+sheet_turnover!W12
我在 PHP 中使用 preg_replace 进行了尝试,我认为我需要以下规则:
- 找到一个或两个字母,后跟一个数字。这始终是公式中的单元格地址。
- 当有 !在之前的位置上,已经有一个sheetname。所以我只寻找不以感叹号开头的字母和数字。
问题似乎是!也是模式中的特殊符号。即使我试图逃避它,它也不起作用:
$newformula =
preg_replace('/(?<\!)[A-Z]{1,2}[0-9]/',
'lala',
$oldformula);
(lala 是我的临时标记,看它是否选择了正确的单元格地址)
(是的,lala 只放在第一个数字上,但现在没问题)
(是的,所有 Excel $..$..(永久)标记都已被替换。无需在公式中构建它)
【问题讨论】:
-
您需要将反斜杠加倍,因为它在字符串文字中具有转义含义,会“吃掉”它们。
-
实际上,
(?<\!)在 PCRE 中是一个无效的正则表达式构造,如果你尝试它,你会得到一个关于不完整组结构的警告。这与这里需要多少转义反斜杠无关。
标签: php regex preg-replace