2011-05-17 48 views
1

reg表達式有一個奇怪的問題。此reg表達式的問題

我試圖讓出來的產品的名稱在一個字符串這樣

#T55.08 #J60.91 #M1/1 #YT102/0///Tie      #G 
#T55.08 #J60.91 #M1/1 #YT102/0///Foulard     #G 
#T55.08 #J60.91 #M1/1 #YT102/0///Pocket handkerchief  #G 

我使用tx2re(http://txt2re.com)創建reg表達式但目前看來,如果產品名稱有少然後4個字符的reg exp不起作用... 你能幫我嗎?

這是我的正則表達式

/(#)(T)(55\\.08)()(#)(J)(60\\.91)()(#)(M)(1)(\\/1)()(#)(YT)(102)(\\/0)(\\/)(\\/)(\\/)((?:[a-z][a-z]+))(.)((?:[a-z][a-z]+))/is 
+5

如果文本到產品名稱是始終字符固定數量的(因爲它似乎是你的樣品中),你只需要在產品名稱,不要」不要使用a正則表達式 – Mat 2011-05-17 14:31:03

+1

表示正則表達式是一團糟。該字符串的哪部分可以更改? – Kelly 2011-05-17 14:32:23

+0

如果你花時間做一些小事情,比如大寫「我」,並且寫出完整的單詞,你可能會得到更多的答覆。 – 2011-05-17 14:35:20

回答

4

這個表達式將捕獲你的產品的名稱:

/#RT55\.08 #J60\.91 #M1\/1 #YT102\/0\/\/\/(.*)#G/ 

我認爲#T55.08 #J60.91 #M1/1 #YT102/0///#G永遠不會改變。

+1

我會用'(。*)'替換'(。*)'。 )\ s *'跳過空格,但是否則很好。 – 2011-05-17 14:39:32

+0

謝謝,我有很多其他字符串像#T56.38#J80.60等等,所以我需要檢查甚至第一部分。所以這個解決方案很完美! – Matteo 2011-05-17 14:47:41

+0

@Matteo,僅供參考,此解決方案僅適用於字符串*的第一部分永遠不會更改*的情況,這與您剛剛評論的方式相反。 – Kelly 2011-05-17 14:59:12

0

如果你只是想要的產品的名稱,你可以使用這個表達式:

.*?\/\/\/(.*?)#G 

但是,如果你的字符串(即一切都交給///)的初始部分是固定的,你可以簡單地使用子。

0

這看起來過於複雜。如果你只需要產品的名稱,你可以使用:

/\/\/\/(.*)#G$/ 
2

你並不需要使用正則表達式這個問題。如果第一段始終保持不變,

$string = "#T55.08 #J60.91 #M1/1 #YT102/0///Pocket handkerchief  #G"; 
$title = trim(substr($string, 33, -2)); 

或者,如果它永遠只是///後:

$title = trim(substr($string, strpos($string,'///')+3, -2)); 

此外,substr會跑得比preg_matchpreg_replace快得多。

1

它看起來像字符串是給定的格式,在行的每一端有#,行內的字段由斜線分隔。

據推測,您知道產品名稱將始終處於該格式的相同字段位置?

在這種情況下,你根本不需要使用正則表達式(當然,並不是像你想出的那樣複雜)。你可以只砍掉領導和treailing #人物和爆炸被斜線的字符串,從結果數組挑選出合適的元素:

$inputrow = trim($inputrow,'#'); 
$fields = explode('/',$inputrow); 
$product_name = trim($fields[5]); 
1

如果產品名稱是始終///前綴你可以使用:

preg_match('~///(.+?)\s*#G$~', $string, $matches); 

產品名稱將在$matches[1]