PHP preg_match:匹配除字符串以外的所有内容
我需要能够提取完整文件路径和名称的片段以插入数据库。为此,我在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
$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)
%'