我需要能够提取完整文件路径和名称的片段以插入数据库。为此,我在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变量。
我在谷歌和我一样都看过这个问题,但我似乎无法找到我正在寻找的答案。
提前感谢您的帮助。
答案 0 :(得分:0)
答案 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)
%'
我假设您从不希望在任何组中出现多个目录,并且目录/文件名永远不会包含下划线或除明确匹配之外的句点。