0

我需要能够提取完整文件路径和名称的片段以插入数据库。为此,我在 PHP 中使用 preg_match。我还从模式中为每个段命名,以便匹配数组是关联的。这是一个例子:

    $subject = 'c:/files/uk/kent/ashford/12345_Joe_Blogs_20120202120000.pdf';
    $pattern = '/[\/\\\\](?<country>.*)[\/\\\\](?<county>.*)[\/\\\\](?<town>.*)[\/\\\\](?<id>.*)_(?<first_name>.*)_(?<last_name>.*)_(?<datetime>.*)\.(?<file_extension>pdf)/';
    preg_match($pattern, $subject, $matches);
    foreach($matches as $key => $match)
    {
        if(is_numeric($key))
            unset($matches[$key]);
    }
    print_r($matches);

这创造了:

    Array
    (
        [country] => files/uk
        [county] => kent
        [town] => ashford
        [id] => 12345
        [first_name] => Joe
        [last_name] => Blogs
        [datetime] => 20120202120000
        [file_extension] => pdf
     )

我的问题是该国家/地区包括我想要的文件夹之前的所有文件夹。我只想要“英国”部分而不是“文件/英国”。所以我需要知道如何匹配除“/”或“\”之外的所有内容。'c:/files' 可以是配置中预先设置的任何内容,因此我不想在模式中包含该变量或任何其他 PHP 变量。

我已经在 Google 等中查找过这个,但我似乎无法找到我正在寻找的答案。

提前感谢您的帮助。

4

4 回答 4

0

为了避免修改棘手的正则表达式,我建议保留现有代码并使用basename函数。

尝试这个:

echo basename($matches['country']);
//outputs "uk"
于 2012-04-30T10:54:40.743 回答
0

将正则表达式更改为:

$pattern = '/[\/\\\\](?<folder>.*)[\/\\\\](?<country>.*)[\/\\\\](?<county>.*)[\/\\\\](?<town>.*)[\/\\\\](?<id>.*)_(?<first_name>.*)_(?<last_name>.*)_(?<datetime>.*)\.(?<file_extension>pdf)/';

然后您在数组中有文件夹成员,您可以稍后使用或丢弃。

于 2012-04-30T10:54:49.290 回答
0

你可以试试这个:

$pattern = '/[\/\\\\](.*)[\/\\\\](?<country>.*)[\/\\\\](?<county>.*)[\/\\\\](?<town>.*)[\/\\\\](?<id>.*)_(?<first_name>.*)_(?<last_name>.*)_(?<datetime>.*)\.(?<file_extension>pdf)/';

它的工作亲爱的..!:)

于 2012-04-30T11:15:50.157 回答
0

尝试更具体地说明您的行为和不想匹配的内容:

'%(?x)
[/\\\\](?P<country>[^_./\\\\]+)
[/\\\\](?P<county>[^_./\\\\]+)
[/\\\\](?P<town>[^_/\\\\]+)
[/\\\\](?P<id>[^_./\\\\]+)
_(?P<first_name>[^_./\\\\]+)
_(?P<last_name>[^_./\\\\]+)
_(?P<datetime>[^_./\\\\]+)
\.(?P<file_extension>pdf)
%'

我假设您永远不希望在任何组中出现多个目录,并且目录/文件名永远不会包含下划线或句点,除非您明确匹配。

于 2012-04-30T20:21:04.763 回答