如何使用 grep、regex 和 PHP 解决意外的令牌错误?

How to resolve unexpected token error with grep, regex, and PHP?

我对 REGEX 非常了解,但仍然坚持使用这个。我正在使用 PHP 5.4 到 shell_exec() 一个带有 REGEX 的 grep 语句来捕获文本文件中的 SKU。在 php 中,我没有看到错误,但 grep 不起作用。

目标是捕获本文中的 SKU:

{'Product_Product_SKU':               'DOP36M94DPM'},

PHP代码:

$cmdSKU1 = 'grep -Po \'(?<=\{\'Product_Product_SKU\':\s{15}\').+?(?=\'\}\,)\' '.$FileName;
$chkSKU1 = trim(shell_exec($cmdSKU1));

此外,当我在 IDE 的调试器工具中查看 $cmdSKU1 变量时,我正在使用它的值是一行:

grep -Po '(?<=\{'Product_Product_SKU':\s{15}').+?(?='\}\,)' /opt/web/default/RetailerParsing/RetailerDownload/MDD30TMSTH__20220113091043.htm

此外,当我将其粘贴到 Ubuntu 控制台时,出现错误:

-bash: syntax eror near unexpected token `)'

即使我回去转义暴露的单引号。事实上,我逃避了一切 [^A-Za-z0-9] 只是为了确保!没有豆子。

最后,如果我尝试在 PHP IDE 中对 REGEX 中的单引号进行双重转义,我会在 [=32= 字样下方出现红色波浪下划线错误].

您没有正确转义 shell 命令。与其手动执行,不如使用 escapeshellarg:

$cmdSKU1 = join(" ", array_map( 'escapeshellarg', array(
   ​"grep",
   ​"-Po",
   ​"(?<={'Product_Product_SKU':\s{15}').+?(?='},)",
   ​$FileName
)));
$chkSKU1 = trim(shell_exec($cmdSKU1));

也就是说,为什么不直接使用 preg_match 并保存对非 POSIX 外部命令的调用?

$string = "{'Product_Product_SKU':               'DOP36M94DPM'},";

preg_match("/{'Product_Product_SKU':\s{15}'([^']+)'}/", $string, $matches);
var_dump($matches[1]);
string(11) "DOP36M94DPM"

当然,您必须阅读 php 中的文件,但可能值得额外的代码。

这里根本不需要正则表达式,当然也不需要 shell_exec。只需拆分 ' 并从结果数组中取出第 4 个(0 索引)值:

$str = "{'Product_Product_SKU':               'DOP36M94DPM'},";
$sku = explode("'", $str)[3];
var_dump($sku);

产量:

string(11) "DOP36M94DPM"

另请注意 PHP 5.4 已在 6 年前停产。你真的应该更新。