php PCRE regex, чтобы получить только имя файла, оканчивающееся на .txt - PullRequest
0 голосов
/ 16 января 2011

, поэтому я пытаюсь сформировать регулярное выражение PCRE в php, специально для использования с preg_replace, которое будет соответствовать любому количеству символов, составляющих текстовое (.txt) имя файла, из этого я выведу каталог файла .

Мой первоначальный подход состоял в том, чтобы определить завершающую строку .txt, а затем попытаться указать совпадение символов для каждого символа, кроме / или \, поэтому я получил что-то вроде:

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

но это, похоже, не сработало вообще, я предполагаю, что это могло бы интерпретировать отрицание как форму деморгана, иначе: (A + B) '<=> A'B'

но после попытки этого теста:

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

Я пришел к тому же результату, который заставил меня подумать, что я не должен избегать оператора или (|), но это также не соответствовало. Кто-нибудь знает, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 16 января 2011

Следующее регулярное выражение должно работать для получения имени файла .txt файлов:

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

Как это работает:

  • .* является жадным, и поэтому силы совпадают так далеко, насколько это возможно.
  • [\\\\/] гарантирует, что перед именем файла будет \ или /.
  • (.*?\.txt) использует не жадное сопоставление, чтобы убедиться, что имя файла настолько мало, насколько это возможно, за которым следует .txt, фиксируя его в группе 1.
  • $ заставляет совпадение находиться в конце строки.
0 голосов
/ 16 января 2011

Попробуйте этот шаблон '/\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"]);
...