PHP preg_match:匹配除字符串以外的所有内容

PHP preg_match:匹配除字符串以外的所有内容,php,regex,preg-match,Php,Regex,Preg Match,我需要能够提取完整文件路径和名称的片段以插入数据库。为此,我在PHP中使用preg_match。我还在模式中为每个段指定一个名称,以便匹配数组是一个关联数组。以下是一个例子: $subject = 'c:/files/uk/kent/ashford/12345_Joe_Blogs_20120202120000.pdf'; $pattern = '/[\/\\\\](?<country>.*)[\/\\\\](?<county>.*)[\/\\\\](?&l

我需要能够提取完整文件路径和名称的片段以插入数据库。为此,我在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);
我的问题是,国家/地区包含我想要的文件夹之前的所有文件夹。我只想要“英国”部分,而不是“文件/英国”。所以我需要知道如何匹配除“/”或“\”之外的所有内容。“c:/files”可以是配置中预先设置的任何内容,因此我不想在模式中包含该变量或任何其他PHP变量

我在谷歌上查过,但似乎找不到我要找的答案


提前感谢您的帮助。

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

试试这个:

echo basename($matches['country']);
//outputs "uk"
将正则表达式更改为:

$pattern = '/[\/\\\\](?<folder>.*)[\/\\\\](?<country>.*)[\/\\\\](?<county>.*)[\/\\\\](?<town>.*)[\/\\\\](?<id>.*)_(?<first_name>.*)_(?<last_name>.*)_(?<datetime>.*)\.(?<file_extension>pdf)/';
$pattern='/[\/\\\\](?.*)[\/\\\\](?.*)[\/\\\](?.*)[\/\\\\](?.*)[\/\\\\\](?.*)\.(?pdf)/';
然后,您就有了数组中的文件夹成员,以后可以使用或丢弃这些成员。

您可以尝试以下方法:

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

它的工作亲爱的……)

试着更具体地说明你所做的和不想匹配的事情:

'%(?x)
[/\\\\](?P<country>[^_./\\\\]+)
[/\\\\](?P<county>[^_./\\\\]+)
[/\\\\](?P<town>[^_/\\\\]+)
[/\\\\](?P<id>[^_./\\\\]+)
_(?P<first_name>[^_./\\\\]+)
_(?P<last_name>[^_./\\\\]+)
_(?P<datetime>[^_./\\\\]+)
\.(?P<file_extension>pdf)
%'
”%(?x)
[/\\\](?P[^./\\\]+)
[/\\\](?P[^./\\\]+)
[/\\\](?P[^\/\\\\]+)
[/\\\](?P[^./\\\]+)
_(?P[^./\\]+)
_(?P[^./\\]+)
_(?P[^./\\]+)
\.(?Ppdf)
%'
我假设您永远不希望在任何组中出现多个目录,并且目录/文件名将永远不包含下划线或句点,除非您显式匹配

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