【发布时间】:2019-03-26 13:16:29
【问题描述】:
目前,我有一个 PHP 函数,它获取 CSV 文件的内容并将其放入一个多维数组,其中包含我使用索引在不同位置打印出来的文本。
一个使用示例是:
$localText[index][pageText][conceptQualityText][$lang];
第一个索引[index] 将是页面的名称。第二个索引[pageText] 将指示它是什么(页面的文本)。第三个索引[conceptQualityText] 表示实际文本是什么。最后一个索引[$lang] 获取所需语言的文本。
所以:
->页面位置
->这是什么
->内容
->应该用什么语言显示。
这在以前的 PHP 版本中运行良好。但是,升级到 7.2,PHP 似乎更加严格了一些。大约 2 年前,当我第一次提出这个解决方案时,我有点绿色,现在知道因为这些索引没有定义为字符串,例如像这样封装在单引号中:['index'],它们符合超全局 (DEFINE) 的符号。那时我没有多想,但现在 PHP 似乎将它们解释为这样(超全局),所以我得到了 x word 是未定义的超全局的错误。
我最初的想法是对我的示例字符串进行搜索和替换:
$localText[index][pageText][conceptQualityText][$lang];
在 Notepad++ 中使用正则表达式功能。
然而,这个例子只是众多例子之一,数组索引的符号基本上是:
$localText[index][index2][index3][$lang];
所以我的问题是:
如何使用 Notepad++ 搜索和替换,使用正则表达式,使我的索引指针变成字符串,而不是充当超全局变量?
例如制作:
$localText[index][index2][index3][$lang];
进入:
$localText['index']['index2']['index3'][$lang];
我需要某种逻辑来检查括号内的内容并用单引号将它们封装起来,除了最后一个索引[$lang]。
我试图提供尽可能多的信息,如果需要详细说明,请告诉我。
我尝试引用these docs,但运气不佳。
【问题讨论】:
-
尝试
(?:\G(?!^)|\B\$\w+)\K\[(?!\$\w+])([^][]+)]并替换为['$1'] -
谢谢@WiktorStribiżew,您的解决方案确实有效(理论上)。但是,我有一些担忧。我需要在很多文件中执行此操作。这将影响括号
[ ]出现的每个实例,对吗?所以我相信使用这个会有“附带”的损害。一种方法是检查它是否以$localText开头。另一个问题是我已经手动进行了一些更改,现在这将是双引号,例如$localText['index'][''index2''][''index3''][$lang];. -
然后使用
(?:\G(?!^)|\B\$\w+)\K\[(\w+)]。见regex101.com/r/E2O02P/1 -
您所说的“附带损害”是什么意思?上面的正则表达式只匹配一个前面没有任何字符字符的
$(它不会在oh$var中匹配),然后将匹配任何[<1+word_chars>]像一个接一个的子字符串。请在this demo 尝试您的数据,并告知您是否需要。否则,请参阅下面的其他解决方案,尽管我从 Poul 的解决方案中看到了更多潜在的“附带损害”,而 Martin 的解决方案可能真的匹配任何类型的三重括号(在任何位置)。