php PCRE regex只获取以.txt结尾的文件名

php PCRE regex只获取以.txt结尾的文件名,php,filepath,regex-negation,backslash,Php,Filepath,Regex Negation,Backslash,因此,我试图在php中形成一个PCRE正则表达式,专门用于preg_replace,它将匹配构成文本(.txt)文件名的任意数量的字符,从中我将导出文件的目录 我最初的方法是定义终止的.txt字符串,然后尝试在每个字符上指定一个字符匹配,除了/或\之外,因此我最终得到如下结果: '/[^\\\\/]*\.txt$/' 但这似乎根本不起作用,我想这可能是将否定解释为德摩根的形式: (A+B)“A'B” 但是在尝试了这个测试之后: '/[^\\\\]\|[^/]*\.txt$/' 我得到了相同的

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

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

'/[^\\\\/]*\.txt$/'
但这似乎根本不起作用,我想这可能是将否定解释为德摩根的形式: (A+B)“A'B”

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

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

我得到了相同的结果,这让我认为我不应该逃避or操作符(|),但这也没有匹配。有人知道我做错了什么吗?

下面的正则表达式应该可以用来获取.txt文件的文件名:

$regex = "#.*[\\\\/](.*?\.txt)$#";
工作原理:

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

尝试此模式
'/\b(?p[\w-.]+\.txt)\b/mi'

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

hmm,我似乎因此变得错误了。我怀疑这可能与我失败的原因相同。我认为反斜杠可能会影响分组和隐式or的工作方式。它失败的字符串是什么?C:\xampp\htdocs\windowz\logs\alkjfaldkjfldskjf.txt(一些字母已被替换,以随机顺序替换为类似的字母…替换的字符中不存在特殊字符)它与文件名匹配对我来说很好。我的测试脚本:,我得到的输出:啊,好吧,我知道发生了什么,preg_match确实返回了文件名的结果,但我应该澄清一下我的问题。所以我想要一个文本文件所在的目录,我的方法是找到文件名,然后通过preg#u replace('\\\.[\\\/](.*.\\.txt)$\\','.$file)替换它,只保留目录。当我使用您提供的正则表达式时,我从preg_replace中得到一个空字符串,如果我去掉了偷偷进入的“mi”(我想这不是故意的),那么它的优点是什么?\b“vs.$”?如果文件名中有空格(因为windows允许它)
mi
代表多行,不区分大小写,对于以大写扩展名命名的文件,等等。
\b
表示字数限制,则
$
是字符串的结尾。如果您还希望将文件名与空格匹配,请将此集合添加到定义中:
/\b(?P[\w\s-.]+\.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"]);