0

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

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

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

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

但在尝试此测试后:

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

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

4

2 回答 2

2

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

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

这个怎么运作:

  • .*是贪婪的,因此力匹配尽可能向右。
  • [\\\\/]确保我们在文件名前面有一个\或。/
  • (.*?\.txt)使用非贪婪匹配来确保文件名尽可能小,然后.txt将其捕获到第 1 组。
  • $强制匹配在字符串的末尾。
于 2011-01-16T09:10:10.570 回答
0

试试这个模式'/\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"]);
于 2011-01-16T09:14:05.667 回答