我需要对大约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);
无论如何,任何和所有帮助表示赞赏!
谢谢, 菲尔
答案 0 :(得分:1)
我遇到的唯一错误是应该删除的字符串结尾$
的锚点。你的表达式也缺少_
字符:
/^(\.\/[0-9a-zA-Z]{1}\/[0-9a-zA-Z]{3}\/[0-9a-zA-Z_]{1,13}\/)/
更通用的模式是排除/
:
/^(\.\/[^\/]{1}\/[^\/]{3}\/[^\/]{1,13}\/)/
答案 1 :(得分:1)
在匹配任何模式之前,您应该使用PHP's builtin parser从csv中提取值。
答案 2 :(得分:0)
$
表示字符串的结尾。因此,如果他们独自在线,那么您的模式将匹配./1/024/9780310320241/
和./t/fla/8204909_flat/
。删除$
,它将匹配字符串的前四个部分,用空格替换它们。
答案 3 :(得分:0)
$pattern = "/(\.\/[0-9a-z]{1}\/[0-9a-z]{3}\/[0-9a-z\_]+\.(jpg|bmp|jpeg|png))\n/is";
我刚刚看到,你的示例字符串不以/结尾,所以你可能应该在最后将它从你的模式中删除。在文件名中也使用下划线,并且应该在字符类中。
答案 4 :(得分:0)
我不确定我明白你在问什么。你的意思是文件中的每一行都是这样的,你想要处理所有这些行吗?如果是这样,这个正则表达式就可以解决这个问题:
'#^.*/#'
这简单地匹配所有内容,包括最后一个斜杠,如果不是每个人都在谈论的流氓'$',你的正则表达式会做什么。如果您想要保留其他格式的其他行,则此正则表达式可能会满足您的需求:
'#^\./\w/\w{3}/\w{1,13}/#"
注意我是如何将正则表达式分隔符从'/'更改为'#'所以我不必转义内部的斜杠。您几乎可以使用任何标点字符作为分隔符(但当然它们都必须相同)。