0

我需要对大约 45k 行的 CSV 文件进行“查找和替换”,然后将其放入数据库中。

我想我应该可以用 PHP 和 preg_replace 做到这一点,但似乎无法弄清楚表达式......

这些行由一个字段组成,并且都采用以下格式:

“./1/024/9780310320241/SPSTANDARD.9780310320241.jpg”或“./t/fla/8204909_flat/SPSTANDARD.8204909_flat.jpg”

第一部分始终为句点,第二部分始终为一个字母数字字符,第三部分始终为三个字母数字字符,第四部分应始终为 1 到 13 个字母数字字符。

我想出了以下似乎是正确的但是我会公开表示对正则表达式一无所知,这对我来说有点新!我可能在这里犯了一大堆愚蠢的错误......

$pattern = "/^(\.\/[0-9a-zA-Z]{1}\/[0-9a-zA-Z]{3}\/[0-9a-zA-Z]{1,13}\/)$/";
$new = preg_replace($pattern, " ", $i);

无论如何,任何和所有的帮助表示赞赏!

谢谢,菲尔

4

5 回答 5

1

$我遇到的唯一错误是应该移除的弦端锚。而且您的表情也缺少_字符:

/^(\.\/[0-9a-zA-Z]{1}\/[0-9a-zA-Z]{3}\/[0-9a-zA-Z_]{1,13}\/)/

更一般的模式是只排除/

/^(\.\/[^\/]{1}\/[^\/]{3}\/[^\/]{1,13}\/)/
于 2009-09-08T10:24:52.287 回答
1

在匹配任何模式之前,您应该使用PHP 的内置解析器从 csv 中提取值。

于 2009-09-08T10:30:04.833 回答
0

表示字符串的$结尾。所以你的模式会匹配./1/024/9780310320241/./t/fla/8204909_flat/如果他们单独在他们的线上。删除$它,它将匹配字符串的前四个部分,用空格替换它们。

于 2009-09-08T10:25:24.173 回答
0
$pattern = "/(\.\/[0-9a-z]{1}\/[0-9a-z]{3}\/[0-9a-z\_]+\.(jpg|bmp|jpeg|png))\n/is";

我刚刚看到,您的示例字符串不以 / 结尾,因此您可能应该在最后将其从模式中删除。下划线也用在文件名中,应该在字符类中。

于 2009-09-08T10:26:21.020 回答
0

我不确定我明白你在问什么。你的意思是文件中的每一行都是这样的,你想处理所有的吗?如果是这样,这个正则表达式可以解决问题:

'#^.*/#' 

这只是匹配所有内容,包括最后一个斜杠,如果不是每个人都在谈论的那个流氓'$',这就是你的正则表达式会做的事情。如果您想保留其他格式的其他行,则此正则表达式可能会满足您的需求:

'#^\./\w/\w{3}/\w{1,13}/#"

请注意我如何将正则表达式分隔符从“/”更改为“#”,这样我就不必转义里面的斜线。您几乎可以使用任何标点符号作为分隔符(当然它们必须相同)。

于 2009-09-08T10:49:53.110 回答