2009-09-08 63 views
0

我需要对大约45k行的CSV文件进行“查找并替换”,然后将其放入数据库中。正则表达式字符串“preg_replace”

我想我应该能够使用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

是jpg文件名总是13个字符? – stefita 2009-09-08 10:24:23

回答

0

我不知道我明白你在问什么。你的意思是文件中的每一行都是这样的,你想要处理它们?如果是这样,这个正则表达式会做的伎俩:

'#^.*/#' 

,简单地匹配一切直到并包括最后的斜线,这是,如果不是因为那个流氓你的正则表达式会做什么,“$”大家都在谈论。如果有其他线路在其他格式要独自离开,此正则表达式可能会满足您的需求:我

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

注意如何改变正则表达式分隔符从“/”到“#”,所以我不知道必须逃避内部的斜线。你几乎可以使用任何标点符号作为分隔符(但当然它们必须是相同的)。

+0

这是更清洁,线条应该都是相同的格式,但我不想这样做。我使用了第二个版本,因为它更简单,更清晰,只需要改为[\ w-]来计算连字符。我是否认为\ w是字母数字字符和下划线? – phil 2009-09-08 11:15:41

+0

是的,'\ w'与'[A-Za-z0-9_]'相同。在其他一些正则表达式中,它还可以匹配重音字母和来自其他文字系统的字母和数字,但PHP的'\ w'仅限于ASCII。 – 2009-09-08 12:01:41

1

我encouter唯一的错误是字符串结束$应删除锚点。和你的表达也缺少_字符:

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

一个更普遍的模式是只排除/

/^(\.\/[^\/]{1}\/[^\/]{3}\/[^\/]{1,13}\/)/ 
+0

谢谢,现在工作正常!很高兴知道我只是犯了一个小错误! 然而第二个例子抛出一个错误! 警告:preg_replace()[function.preg-replace]:未知修饰符']' 虽然第一个工作正常。 再次感谢! – phil 2009-09-08 10:36:51

+0

@phil:修正了它。 – Gumbo 2009-09-08 11:09:49

0

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

0
$pattern = "/(\.\/[0-9a-z]{1}\/[0-9a-z]{3}\/[0-9a-z\_]+\.(jpg|bmp|jpeg|png))\n/is"; 

我刚才看到,你的示例字符串不会以/结尾,所以可能你应该从最后的模式中删除它。下划线也用在文件名中,并且应该放在字符类中。

1

在匹配任何模式之前,您应该使用PHP's builtin parser从csv中提取值。

+0

这些值在正在处理的文件中没有围绕它们的引号。 纯粹出于教育兴趣,我将如何去执行相同的模式替换,而不使用正则表达式?我不知道从哪里开始恐怕。 – phil 2009-09-08 10:50:37

+0

对不起,我没有很好地阅读你的问题。我猜你*必须*在这里使用正则表达式,但是我会先从csv中提取值,然后再应用RE。 – soulmerge 2009-09-08 11:18:30