Laravel 10 API读取Python脚本name变量失败:preg_match匹配问题
问题原因与修复方案
核心问题分析
你的Python脚本读取逻辑存在两个关键错误:
- 匹配对象错误:你通过
exec执行Python脚本后,获取的是print(name)的输出(即Python test),但正则表达式却在匹配name = "xxx"这种变量定义行,两者完全不匹配,导致无法捕获到值。 - 提前终止方法:代码中的
return('I work');会直接终止整个控制器方法,不仅无法将匹配到的name加入数组,还会跳过后续所有插件的处理。
修复后的代码
直接参考PHP/JS的处理逻辑,读取Python文件内容后用正则匹配变量定义,同时移除错误的return语句:
<?php namespace App\Http\Controllers\API; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\File; class PluginAPIController extends Controller { public function list() { $plugins = File::files(public_path('testplugins')); $names = []; foreach ($plugins as $file) { $extension = pathinfo($file, PATHINFO_EXTENSION); $contents = File::get($file); $matches = []; if($extension == "php"){ preg_match('/\$name\s*=\s*\'(.*)\';/i', $contents, $matches); if (isset($matches[1])) { $names[] = $matches[1]; } }elseif ($extension == "js") { preg_match('/var\s+name\s*=\s*[\'"]([^\'"]+)[\'"];/i', $contents, $matches); if (isset($matches[1])) { $names[] = $matches[1]; } }elseif ($extension == 'py') { // 直接读取文件内容,匹配Python的name变量定义 preg_match('/name\s*=\s*[\'"](.*?)[\'"]/i', $contents, $matches); if (isset($matches[1])) { $names[] = $matches[1]; } } } return $names; } }
说明
- 改用直接读取文件内容的方式,避免了执行外部Python命令的安全风险和环境依赖问题,逻辑和PHP/JS保持一致,更易维护。
- 正则表达式
/name\s*=\s*[\'"](.*?)[\'"]/i可以匹配Python中name = "xxx"或name='xxx'的变量定义,忽略大小写和等号前后的空格。
内容的提问来源于stack exchange,提问作者beardchu
相关产品推荐
相关产品推荐

