2012-03-27 20 views
1

我有這種格式從一個數據庫來的數據...可選字符替換

BUS 101S Business and Society 

BUS 101 Business and Society 

通知可選的「S」字符(它可以是任何大寫字符)

我需要更換空,這裏的「BUS 101S」的部分是什麼,我想出了...

$value = "BUS 101S Business and Society"; 
$sub = substr($value, 0, 3); // Gives me "BUS" 
$num = substr($value, 4, 3); // Gives me "101" 
$new_value = preg_replace("/$sub $num"."[A-Z]?/", null, $value); 

$new_value的值現在包含S Business and Society。所以我很接近,只需要它來替換可選的單個大寫字符。有任何想法嗎?

+0

您鱈魚的所有組件e已經爲我工作,但有更簡單的方法來做到這一點! – Cal 2012-03-27 18:38:42

+0

嗯......這很奇怪。我同意有更簡單的方法,很高興我現在從答案中看到了這一點。 – 2012-03-27 18:46:15

回答

7

假設圖案是3個大寫字母,3個數字,然後任選的大寫字母,只是使用單個preg_match

$new = preg_replace('/^[A-Z]{3} \d{3}[A-Z]?/', '', $old); 

^將只匹配在一行/字符串的開頭。 {3}的意思是「精確地匹配前面的令牌3次」。該?的意思是「匹配前面的標記零次或一次」

+0

嗯,我已經試過你的代碼在一個新的PHP文件與我發佈在我的問題,它的作品很好,所以這是我的問題的答案,爲什麼它不工作在我的其他代碼是讓我拉我的頭髮但除了我在問題中發佈的內容之外,肯定還有其他問題。謝謝你的幫助。 – 2012-03-27 18:51:26

0

豈不是更容易做這樣的事情:

$str = 'BUS 101S Business and Society'; 
$words = explode(' ', $str); 
array_unshift($words); // bus 
array_unshift($words); // 101s 
$str = implode(' ', $words); 
+0

我試過了,它似乎沒有工作... – 2012-03-27 18:49:32

1

你也可以做這樣的事情,所以你不要打擾與SUBSTR:

preg_replace('#^[A-Z]{3} [0-9]{3}[A-Z]? (.*)$#', '$1', $value); 

或者使用的preg_match,得到的字符串

if (preg_match('#^([A-Z]{3}) ([0-9]{3})([A-Z]?) (.*)$#', $value, $matches)) { 
    $firstMatch=$matches[1];//BUS ($matches[0] is the whole string) 
    $secondMatch=$matches[2];//101 
    $secondMatch=$matches[3];//S or '' 
    $secondMatch=$matches[4];//the rest of the text 
} 
+0

我同意,雖然我確實需要'substr()',因爲我稍後使用這些變量,但感謝指出,以簡化正則表達式的閱讀。 – 2012-03-27 18:48:54

+0

然後你可以使用preg_match,看看我更新的答案(在幾分鐘內) – haltabush 2012-03-27 19:05:59

+0

我不知道。感謝您指出了這一點!希望我能接受兩個答案... – 2012-03-27 19:36:37