2009-09-08 47 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