如何使用 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 年前停产。你真的应该更新。
我对 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 年前停产。你真的应该更新。