我有一点问题,我显然无法解决。它涉及PCRE实施负面前瞻和后面条件,应该(但显然不)一起工作。
我有一个包含JavaScript兼容语法的常量的字符串。需要将此字符串的语法转换为符合JSON标准。
当我尝试用引号封装对象属性键时,我需要将“真实”属性键与数组中包含的字符串区分开来,这看起来像属性键。
const Const = {
propertyKeyA: "someValue",
propertyKeyB: ["ThisIsMyHeadache:ItShouldNotBeChanged"]
};
{
"propertyKeyA": "someValue",
"propertyKeyB": ["ThisIsMyHeadache:ItShouldNotBeChanged"]
}
$output = preg_replace(
'~(?:^|\b) (?![\'"]) (\w+) (?<![\'"]) :~mx',
'"\1":',
$input
);
这导致:
{
"propertyKeyA": "someValue",
"propertyKeyB": [""ThisIsMyHeadache":ItShouldNotBeChanged"]
}
注意数组定义中的双引号。在我看来好像条件根本不起作用。
有没有人知道如何解决这个问题?非常感谢!
最好,克里斯
你混合前瞻和后仰位置。
(?![\'"])(\w+)
等于(\w+)
,因为(?![\'"])
是一个负向前瞻,并且要求下一个char不是'
或"
,但由于下一个模式是\w
,匹配单词char,前瞻变得多余。你需要在这里使用负面的lookbehind,(?<![\'"]) (\w+)
。 (\w+)(?<![\'"])
的问题是类似的:char这个词不能是'
和"
,负面的lookbehind是多余的。你想在这里前瞻。
你需要使用
'~(?:^|\b) (?<![\'"]) (\w+) (?![\'"]) :~mx'
由Wiktor在我的初步问题的评论中发布,这是解决方案:
'~(?:^|\b) (?<![\'"]) (\w+) (?![\'"]) :~mx'