You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用preg_replace仅替换引号外的点语法为数组下标形式?

解决PHP变量点语法转数组语法的正则问题

要实现只替换变量后的点语法(如$app.url转$app[url]),同时保留单引号内的字符串(如'domain.ext'不修改),可以使用带有(*SKIP)(*FAIL)标记的正则表达式来排除单引号内的内容。

正确代码示例

$input = '$app.url = $cfg.url ? $cfg.url : \'domain.ext\';';
$result = preg_replace('/\'[^\']*\'(*SKIP)(*FAIL)|\.(\w+)/', '[$1]', $input);
echo $result;

执行后输出:

$app[url] = $cfg[url] ? $cfg[url] : 'domain.ext';

正则逻辑说明

  • '[^']*'(*SKIP)(*FAIL):匹配所有单引号包裹的字符串,(*SKIP)(*FAIL)告诉正则引擎跳过这些匹配内容,不进行替换。
  • |\.(\w+):匹配不在单引号内的.后跟字母/数字/下划线的部分,将其替换为[$1]($1对应捕获到的单词部分)。

之前尝试的问题分析

  1. 第一个正则/(\.)(\w+)/没有排除单引号内的内容,会无差别替换所有.后的单词,导致'domain.ext'被改为'domain[ext]'。
  2. 第二个正则/(!\')(\.)(\w+)/存在语法错误:(!')不是有效的正则表达式语法,正确的负向预查应为(?<!'),但即便修正,这种方式也只能确保.前不是单引号,无法全面排除单引号内的所有内容,不如(*SKIP)(*FAIL)的方法可靠。

内容的提问来源于stack exchange,提问作者Ludwig Schmidt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:55:24