【问题标题】:php PCRE regex to get only the file name that terminates in .txtphp PCRE 正则表达式仅获取以 .txt 结尾的文件名
【发布时间】:2011-01-16 08:59:45
【问题描述】:

所以我试图在 php 中形成一个 PCRE 正则表达式,专门用于 preg_replace,它将匹配构成文本(.txt)文件名的任意数量的字符,从中我将派生文件的目录.

我最初的方法是定义终止的 .txt 字符串,然后尝试在除 / 或 \ 之外的每个字符上指定一个字符匹配,所以我最终得到如下内容:

'/[^\\\\/]*\.txt$/'

但这似乎根本不起作用,我认为它可能将否定解释为 demorgan 的形式又名: (A+B)' A'B'

但是在尝试了这个测试之后:

'/[^\\\\]\|[^/]*\.txt$/'

我得出了同样的结果,这让我觉得我不应该逃避 or 运算符(|),但这也不匹配。有谁知道我做错了什么?

【问题讨论】:

    标签: php filepath regex-negation backslash


    【解决方案1】:

    以下正则表达式应该适用于获取 .txt 文件的文件名:

    $regex = "#.*[\\\\/](.*?\.txt)$#";
    

    它是如何工作的:

    • .* 是贪婪的,因此强制匹配尽可能靠右。
    • [\\\\/] 确保我们在文件名前有 \/
    • (.*?\.txt) 使用非贪婪匹配来确保文件名尽可能小,然后是 .txt,将其捕获到第 1 组。
    • $ 强制匹配位于字符串末尾。

    【讨论】:

    • 嗯,我似乎因此而变得虚假。我怀疑这可能与我失败的原因相同。我在想反斜杠可能会对分组和隐式或工作方式产生影响。
    • 失败的字符串是什么?
    • C:\xampp\htdocs\windowz\logs\alkjfaldkjfldskjf.txt(部分字母已被替换,随机排序的相似字母...替换后的字符中不存在特殊字符)
    • 它与我的文件名匹配。我的测试脚本:pastie.org/1466074,我得到的输出:pastie.org/1466077
    • 啊好的,我知道发生了什么,preg_match 确实返回了文件名的结果,但我应该稍微澄清一下我的问题。所以我想要一个文本文件所在的目录,我的方法是找到文件名,然后通过以下方式替换它: preg_replace('#.*[\\\\/](.*?\.txt)$# ', '', $file) 只保留目录。当我使用您提供的正则表达式时,我从 preg_replace 得到一个空字符串
    【解决方案2】:

    试试这个模式'/\b(?P<files>[\w-.]+\.txt)\b/mi'

    $PATTERN = '/\b(?P<files>[\w-.]+\.txt)\b/mi';
    $subject = 'foo.bar.txt plop foo.bar.txtbaz foo.txt';
    preg_match_all($PATTERN, $subject, $matches);
    var_dump($matches["files"]);
    

    【讨论】:

    • 如果我取出潜入的'mi'似乎可以工作(我认为这不是故意的),'\b'与'$'的优势是什么?跨度>
    • 如果文件名中有空格怎么办(因为windows允许这样做)
    • mi 代表多行且不区分大小写,以防文件以大写扩展名命名等。
    • \b 表示字数限制,那么$ 是字符串的结尾。
    • 如果您还想要匹配带有空格的文件名,请在定义中添加此集合\s/\b(?P&lt;files&gt;[\w\s-.]+\.txt)\b/mi
    猜你喜欢
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多