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

时间:2012-04-30 10:48:49

标签: php regex preg-match

我需要能够提取完整文件路径和名称的片段以插入数据库。为此,我在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
     )

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

我在谷歌和我一样都看过这个问题,但我似乎无法找到我正在寻找的答案。

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

为避免修改棘手的Regex,我建议您保留现有代码并使用basename功能。

试试这个:

echo basename($matches['country']);
//outputs "uk"

答案 1 :(得分:0)

将正则表达式更改为:

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

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

答案 2 :(得分:0)

你可以试试这个:

$pattern = '/[\/\\\\](.*)[\/\\\\](?<country>.*)[\/\\\\](?<county>.*)[\/\\\\](?<town>.*)[\/\\\\](?<id>.*)_(?<first_name>.*)_(?<last_name>.*)_(?<datetime>.*)\.(?<file_extension>pdf)/';
亲爱的工作......! :)

答案 3 :(得分:0)

尝试更具体地说明你做什么和不想匹配的事情:

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

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