Php 准备正则表达式以使用格式良好的代码

Php 准备正则表达式以使用格式良好的代码,php,regex,Php,Regex,我正在研究从zbozi.cz获取数据的数据解析器,我遇到了一个问题。 函数parse将我从zbozi.cz获得的数据准备为有效的JSON并对其进行解码。退房 我不熟悉正则表达式,但我试图用我的书创建一个正则表达式-我有这样的东西(我缩短了它): /**/ 我需要得到一个有效的JSON来用我的解析函数对其进行解码。我正在使用pattern/.\(/和preg\u replace函数在{id:…}出现之前删除内容。不幸的是,将来他们可能会添加更多的空格、整理代码或使我的脚本无法工作的东西 我所需要的

我正在研究从zbozi.cz获取数据的数据解析器,我遇到了一个问题。 函数parse将我从zbozi.cz获得的数据准备为有效的JSON并对其进行解码。退房

我不熟悉正则表达式,但我试图用我的书创建一个正则表达式-我有这样的东西(我缩短了它):

/**/

我需要得到一个有效的JSON来用我的解析函数对其进行解码。我正在使用pattern
/.\(/
preg\u replace
函数在
{id:…}
出现之前删除内容。不幸的是,将来他们可能会添加更多的空格、整理代码或使我的脚本无法工作的东西

我所需要的一切就是编辑解析函数(下面的链接)。第23行的正则表达式模式和下面几行的一些
str\u replace
需要为
preg\u replace
函数更改。您能帮我吗

这是我的脚本使用的代码--只需按住CTRL键F并查找Zbozi.Common.Result

而且我的脚本与 -第305行

我需要更改regex以使其能够处理这两个文件。

您可以尝试以下操作:

$subject = <<<'LOD'
/* <![CDATA[ */ new Zbozi.Common.Result( 
{ id: 'itemRow-0', url: 'http://www.muzikant.cz/zbozi/allen-heath-xone-22-81095.php', pos: '1' },
{ itemId: '3118517', longItemId: '117890214602569005', productId: '0', premiseId: '1675', zboziUserId: 'f11b5249-5e43-47f7-aca0-96ec4d0fde14',
  sessionId: 'kQ8Fq1bSww4nr9E1kPBc', q: 'Allen &amp; Heath Xone:22', title: 'ALLEN HEATH XONE:22', paid: 1, cn: '7770.00', frel: '948571',
  crel: '0.952682', irel: '0.960918', x: 'pict' },
{ url: '/action/1675/clickthru?c=aaFoxUbWdnjpMksl5JN9avgl-1p673W9H8qxBpkl0O4xUptIPy0Y8P_IA72jS2Se_vxNj-eGQ5McH7EUlfXeeDVCYNIunim45PB8RS-eizcZorpKyMNlwTnUdUb1PjkvFQXDbSjMJeJmRcGnSWOyQyAGcL5ZQcreNFnXv1Xr5yEDjNxbPjyiD1mZI1Vm3PuqU7XrSrhtPx_LdipcNNdk2skaKYqFH-vRreCOwZ3F7ZWFbeOByzi3bg8eVJsFmyqNBy0uKaSdAF_yGMym4ZujVZPzvExObpsAMSHb0CtLK5KhNNYgTXP6bRKDAeJLGc-nnMdNKlOMuBKZKFaJrrWo6M60zsCM4tHvFGb30gb3s_M=',
 label: 'item_featured', productName: 'ALLEN HEATH XONE:22', cp: '5B9DN0UD-qzuhuuvvKKZjg==' }, null ); /* ]]> */
LOD;

$replacements = array(
    '~/\* \s*+ \Q<![CDATA[\E \s*+ \*/ \s*+ new \s++ \QZbozi.Common.Result\E \s*+ \( \s*+~x' => '[',
    '~(?<=}) \s*+ , \s*+ null \s*+ \); \s*+ /\* \s*+ ]]> \s*+ \*/~x'                        => ']',
    '~(?> \\{2} )*+ \K \'~x'                                                                => '"',
    '~" [^"]*+ " (*SKIP) (*FAIL) | \s*+ (\w++) \s*+ : \s*+~x'                               => ' "$1":'
);

foreach ($replacements as $pattern => $replacement) {
    $subject = preg_replace($pattern, $replacement, $subject);
}

var_dump($subject);
$subject=']',
“(?>\{2})*+\K\'~x'=>”,
“~”[^“]*+”(*跳过)(*失败)|\s*+(\w++)\s*+:\s*+~x'=>”“$1”:”
);
foreach($pattern=>$replacement的替换){
$subject=preg_replace($pattern,$replacement,$subject);
}
var_dump($主题);
图案详情: 前两种模式的目的是在(futur)JSON对象之后和之前修剪不需要的内容。最后两个模式用于引号

在所有模式中:

为了提高可读性,我使用了
x
修饰符(extended mod),因此忽略了空格。同样地,
\Q..\E
syntaxe用于编写一般子字符串。(内部忽略特殊字符)

所有量词都是所有格(
++
*++
),而不是简单的量词(
++
*
)。获得结果并不重要(第三种模式除外),但这些结果向正则表达式引擎表明,不需要记录回溯位置。您可以找到更多关于此的信息。
替换非捕获组的
(?>…)
也一样
(?:…)

第一种模式:

没有什么特别的,必须转义文字atserisk,并使用
\Q…。\E
语法,避免转义开头的方括号和点

第二种模式:

A
(?您可以尝试以下方法:

$subject = <<<'LOD'
/* <![CDATA[ */ new Zbozi.Common.Result( 
{ id: 'itemRow-0', url: 'http://www.muzikant.cz/zbozi/allen-heath-xone-22-81095.php', pos: '1' },
{ itemId: '3118517', longItemId: '117890214602569005', productId: '0', premiseId: '1675', zboziUserId: 'f11b5249-5e43-47f7-aca0-96ec4d0fde14',
  sessionId: 'kQ8Fq1bSww4nr9E1kPBc', q: 'Allen &amp; Heath Xone:22', title: 'ALLEN HEATH XONE:22', paid: 1, cn: '7770.00', frel: '948571',
  crel: '0.952682', irel: '0.960918', x: 'pict' },
{ url: '/action/1675/clickthru?c=aaFoxUbWdnjpMksl5JN9avgl-1p673W9H8qxBpkl0O4xUptIPy0Y8P_IA72jS2Se_vxNj-eGQ5McH7EUlfXeeDVCYNIunim45PB8RS-eizcZorpKyMNlwTnUdUb1PjkvFQXDbSjMJeJmRcGnSWOyQyAGcL5ZQcreNFnXv1Xr5yEDjNxbPjyiD1mZI1Vm3PuqU7XrSrhtPx_LdipcNNdk2skaKYqFH-vRreCOwZ3F7ZWFbeOByzi3bg8eVJsFmyqNBy0uKaSdAF_yGMym4ZujVZPzvExObpsAMSHb0CtLK5KhNNYgTXP6bRKDAeJLGc-nnMdNKlOMuBKZKFaJrrWo6M60zsCM4tHvFGb30gb3s_M=',
 label: 'item_featured', productName: 'ALLEN HEATH XONE:22', cp: '5B9DN0UD-qzuhuuvvKKZjg==' }, null ); /* ]]> */
LOD;

$replacements = array(
    '~/\* \s*+ \Q<![CDATA[\E \s*+ \*/ \s*+ new \s++ \QZbozi.Common.Result\E \s*+ \( \s*+~x' => '[',
    '~(?<=}) \s*+ , \s*+ null \s*+ \); \s*+ /\* \s*+ ]]> \s*+ \*/~x'                        => ']',
    '~(?> \\{2} )*+ \K \'~x'                                                                => '"',
    '~" [^"]*+ " (*SKIP) (*FAIL) | \s*+ (\w++) \s*+ : \s*+~x'                               => ' "$1":'
);

foreach ($replacements as $pattern => $replacement) {
    $subject = preg_replace($pattern, $replacement, $subject);
}

var_dump($subject);
$subject=']',
“(?>\{2})*+\K\'~x'=>”,
“~”[^“]*+”(*跳过)(*失败)|\s*+(\w++)\s*+:\s*+~x'=>”“$1”:”
);
foreach($pattern=>$replacement的替换){
$subject=preg_replace($pattern,$replacement,$subject);
}
var_dump($主题);
图案详情: 前两种模式的目的是在(futur)JSON对象之后和之前修剪不需要的内容。最后两个模式用于引号

在所有模式中:

为了提高可读性,我使用了
x
修饰符(extended mod),因此忽略了空格。同样地,
\Q..\E
syntaxe用于编写一般子字符串。(内部忽略特殊字符)

所有量词都是所有格(
++
*++
),而不是简单的量词(
++
*
)。获得结果并不重要(第三种模式除外),但这些结果向正则表达式引擎表明,不需要记录回溯位置。您可以找到更多关于此的信息。
替换非捕获组的
(?>…)
也一样
(?:…)

第一种模式:

没有什么特别的,必须转义文字atserisk,并使用
\Q…。\E
语法,避免转义开头的方括号和点

第二种模式:


A
(?我的英语不是很好,所以请对我好一点,问问你是否需要更多信息。谢谢我的英语不是很好,所以请对我好一点,问问你是否需要更多信息。thanks@JiriTravnicek:谢谢,请稍等。我正在写解释。我理解得更多,但无论如何我需要练习:)我很高兴我写了
/*\(/
在学习了我书中的正则表达式一个小时后。再次感谢你!一个复杂的正则表达式告诉我这是一个错误的工作工具…除非你喜欢写一次,否则永远不要再读它:)这是OP要求的,我只是希望我永远不必编辑正则表达式。@JuanMendes:regex和任何语言一样,当你有很好的知识时,你可以很容易地阅读它。作为旁白,这些模式并不复杂。在组中没有组,在后向引用的前向中没有后向。有JU我很惊讶你说这不是一个复杂的概念regex@JiriTravnicek:谢谢,请稍等。我正在写解释。我理解得更多,但无论如何我需要练习:)我很高兴我写了
/*\(/
在学习了我书中的正则表达式一个小时后。再次感谢你!一个复杂的正则表达式告诉我这是一个错误的工作工具…除非你喜欢写一次,否则永远不要再读它:)这是OP要求的,我只是希望我永远不必编辑正则表达式。@JuanMendes:regex和任何语言一样,当你有很好的知识时,你可以很容易地阅读它。作为旁白,这些模式并不复杂。在组中没有组,在后向引用的前向中没有后向。有JU我很惊讶你说这不是一个复杂的正则表达式