【问题标题】:46: regex error 17 for `(dryad-bibo/v)[0-9].[0-9]', (match failed)46: '(dryad-bibo/v)[0-9].[0-9]' 的正则表达式错误 17,(匹配失败)
【发布时间】:2021-11-12 06:50:26
【问题描述】:

我正在尝试使用 libmagic 和以下代码来确定几种文件的 mime 类型:

auto handle = ::magic_open(MAGIC_MIME_TYPE);
::magic_load(handle, NULL);

// Both of these fail with the same error
// file_path being a const char* with the path to the file.
auto type2 = ::magic_file(handle, file_path);

// svg_content being an std::vector<char> with the contents of the file.
//auto type2 = ::magic_buffer(handle, svg_content.data(), svg_content.size()); 

if(!type2)
{
   std::cout << magic_error(handle) << std::endl;
}
    
::magic_close(handle);

但是对于我尝试的任何文件或缓冲区,我都会收到正则表达式错误,或者是或类似于:

46: `(dryad-bibo/v)[0-9].[0-9]' 的正则表达式错误 17,(匹配失败)

例如这个 .svg 文件:

<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-no" viewBox="0 0 640 480">
  <path fill="#ed2939" d="M0 0h640v480H0z"/>
  <path fill="#fff" d="M180 0h120v480H180z"/>
  <path fill="#fff" d="M0 180h640v120H0z"/>
  <path fill="#002664" d="M210 0h60v480h-60z"/>
  <path fill="#002664" d="M0 210h640v60H0z"/>
</svg>

到目前为止我已经尝试过:

  • libmagic 5.35
  • libmagic 5.39
  • libmagic 5.40
  • 来自 opensource.apple 的 libmagic
  • 将 LC_TYPE 和 LANG 设置为“C”

我正在链接一个在本地构建的 libmagic 版本,在构建过程中我是否遗漏了什么?是否有任何呼叫不正确或我遗漏了什么?

在尝试运行本地编译的相关文件二进制文件时,我遇到了类似的错误。而当我使用默认可用的文件命令时,我会得到 image/svg+xml 作为输出。

编辑

为了构建 libmagic(适用于 macOS 和 Ubuntu),我按照以下步骤操作:

  • Github下载相关版本
  • autoreconf --install
  • ./配置
  • 制作
  • 进行安装

更新

看起来这个文件底部的正则表达式导致了问题(至少对于 svg):

https://github.com/file/file/blob/b56b58d499dbe58f2bed28e6b3c297fe7add992e/magic/Magdir/dataone

更新 2

发生了一些奇怪的事情;在我让它工作的系统上,magic_version() 按预期报告 540。但在出现此错误的系统上,magic_version() 报告 538

这对我来说意义不大,因为我在系统本身的任何地方都找不到该版本,当我在构建库中运行 ./file --version 时,它会报告 file-5.40

【问题讨论】:

  • 你为什么不使用解析器呢?
  • 我想检测几个不同文件的 mime 类型和没有文件名的内容,而不仅仅是 svg - 这是一个例子。据我所知,libmagic 是最好的选择。

标签: c++ macos ubuntu mime-types libmagic


【解决方案1】:

在 Ubuntu 20.04 上测试:

克隆仓库

git clone git@github.com:file/file.git
cd file/

在 repo 的新克隆中试试这个:

autoreconf -f -i
./configure --disable-silent-rules
make -j4
make -C tests check

并查看是否有任何错误报告。使用make install 安装后,获取一些名为“test.xml”的有效xml 文件并将其与main.c 一起放入某个文件夹:

#include <stdio.h>
#include <magic.h>

int main(void)
{
    char *actual_file = "test.xml";
    const char *magic_full;
    magic_t magic_cookie;

    /* MAGIC_MIME tells magic to return a mime of the file,
       but you can specify different things */
    magic_cookie = magic_open(MAGIC_MIME);

    if (magic_cookie == NULL) {
        printf("unable to initialize magic library\n");
        return 1;
    }

    printf("Loading default magic database\n");

    if (magic_load(magic_cookie, NULL) != 0) {
        printf("cannot load magic database - %s\n", magic_error(magic_cookie));
        magic_close(magic_cookie);
        return 1;
    }

    magic_full = magic_file(magic_cookie, actual_file);
    printf("%s\n", magic_full);
    magic_close(magic_cookie);
    return 0;
}

(感谢vivithemage。)

编译并尝试:

$ gcc main.c -lmagic
$ ./a.out 
Loading default magic database
text/xml; charset=us-ascii

如果它在您的系统上不起作用,请在 project's bugtracker 上报告错误,并附上您的操作系统和架构的规范。您可以尝试通过从更新中找到的文件中删除违规记录来修复您的问题。

【讨论】:

  • 使用make: *** No rule to make target distclean'设置失败。`
  • @Thizzer,这是我的错误,我已经删除了这一步,它在我的 Ubuntu 上也是如此。对此感到抱歉。固定在答案中。我已经直接从文档中复制了,我也会修复上游的东西......
  • 发生了一些奇怪的事情;在我让它工作的系统上,magic_version() 按预期报告 540。但是在出现此错误而失败的系统上,magic_version() 报告 538。这对我来说意义不大,因为我无法在系统本身的任何地方找到该版本。
  • 有趣...搜索此路径:echo | gcc -E -Wp,-v - 在您的系统上,无论您是否没有两个冲突的安装。
【解决方案2】:

非常不满意的答案,但它链接到 GoogleTest 不知何故导致了这个错误,甚至没有运行任何测试,只是链接到它。

我改用Catch2,问题得到解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2012-07-13
    • 2018-07-19
    相关资源
    最近更新 更多