【问题标题】:Regex matching a space after extension PCRE (php)正则表达式匹配扩展 PCRE 后的空格(php)
【发布时间】:2018-10-01 06:46:51
【问题描述】:

我正在尝试迁移一个相当大且相当旧的数据库,其中一列包含文件名。问题是在这个字段中可以有多个文件名,由空格分隔。 例如:

"Filename.mp3 file anem.mid fi le nam e.rm"

我试图用preg_split() 分割这些字符串,我能想到的最接近的正则表达式是

/(?<=\.[\w]{3})(\s)/

我知道/(?<=\.[\w]+)(\s)/ 不起作用,因为在 PCRE 中,lookbehind 必须具有固定的宽度。由于这是一个音乐数据库,因此也有非常规的扩展。

有什么建议吗?

【问题讨论】:

  • 嗯,讨厌!我预测,一个正则表达式天才的人会为你得到这个。同时,如果这是我的问题,我会做你正在做的事情(尝试地狱,然后寻求帮助(-:),如果这不起作用,我会叹息并将这个字符串的处理分解为多个步骤。也许用/\.[a-z]+\b/ 分割扩展名并捕获分隔符之间的内容;左修剪分隔符后的任何内容;连接......类似的东西。

标签: php regex pcre


【解决方案1】:

您可以使用此正则表达式进行拆分:

~\.\w+\K\h+~

RegEx Demo

正则表达式详细信息:

  • \.:匹配文字点
  • \w+: 匹配 1+ 个单词字符
  • \K: 重置匹配信息(忘记匹配数据)
  • \h+: 匹配 1+ 个水平空格

【讨论】:

  • 非常感谢,不知道\K!
【解决方案2】:

如果您不想使用正则表达式,那么这是一个可行的解决方案:

<?php
$filename = "Filename.mp3 file anem.mid fi le nam e.rm";

// Temp storage for a single file's pieces
$new_filename = [];

// Store whole files
$filenames = [];

// Split up the string based on spaces
$spaces = explode( ' ', $filename );

// Loop the pieces broken by a space
foreach( $spaces as $piece )
{
    // just keep adding pieces to this array
    $new_filename[] = $piece;

    // if this piece contains a period then we have a whole filename
    if( strpos( $piece, '.' ) !== false )
    {
        // add this whole filename to the list by rejoining the temp var on spaces
        $filenames[] = implode( ' ', $new_filename );

        // reset the temp variable
        $new_filename = [];
    }
}

print_r( $filenames );

输出:

Array
(
    [0] => Filename.mp3
    [1] => file anem.mid
    [2] => fi le nam e.rm
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多