2012-02-09 21 views
0

考慮以下字符串:

$MRK - Merck - ($AAPL, $MSFT, $F) having day $AA! like $P and me :) 

雖然這是jibberish,就說明我的問題。我想掃描所有以美元符號($)開頭的單詞,並根據預先定義的代碼列表進行檢查。如果有相匹配的,帶有標籤({TICKER})替換它們,如下所示:

{TICKER} - Merck - ({TICKER}, {TICKER},{TICKER}) having a day {TICKER}! like 
{TICKER} an me :) 

我現在使用此功能:

function _process_tickers($string) { 
    $result = db_query("SELECT symbol FROM us_stocks"); 
    while ($row = db_fetch_object($result)) { 
    $tickers[] = ' $' . $row->symbol . ' '; 
    } 
    return str_replace($tickers, ' {TICKER} ', $tweet); 
} 

問題:由空格包圍這隻漁獲行情(這$ AA被空格包圍),但不包括其他情況,例如(此代碼在$ AA前面只有一個空格)或(這個代碼被逗號包圍:我的$ AA代碼)。但也有兩個緊跟在一起的人(對$ AA $ XOM感到滿意) - 應該會變得很滿意(TICKER} {TICKER})。我如何處理所有這些可能的情況?

+4

而且在eigh第四天,天空中的偉大處理器創建了**正則表達式**。他看着他創造了什麼,這很好。你需要['preg_replace'](http://php.net/manual/en/function.preg-replace.php)來完成比簡單字符串替換更復雜的任何事情。歡迎來到模式匹配的世界。 – rdlowrey 2012-02-09 15:01:13

回答

1

使用正則表達式:

preg_replace('/\$[A-Z]+/', '{TICKER}', $tweet); 
+0

謝謝!對於我的信息,如果你看Dutchie432的答案(和下面的評論),使用正則表達式有什麼優勢,我現在沒有看到? – Pr0no 2012-02-09 15:11:05

+1

@Reveller:你根本不需要查詢數據庫就可以使用它。 – Ryan 2012-02-09 15:13:30

+0

有一個問題:我會期待preg_replace('/ \ $ [A-Z] + /','{TICKER:$ 1}',$ tweet);例如返回匹配的模式爲{TICKER:MRK},但是$ 1不返回任何內容?你能解釋一下嗎? – Pr0no 2012-02-09 23:01:51

1

什麼改變這種代碼

$tickers[] = ' $' . $row->symbol . ' '; 

本的缺點?

$tickers[] = '$' . $row->symbol; 

這樣做會使此更改無論前後有什麼內容。

+0

'$ AAPL $ A' - >'{TICKER} APL {TICKER}' – Ryan 2012-02-09 15:04:59

+1

我首先想到的是:Dutchie432說了些什麼,我什麼都不傻。然後我看到了同樣的問題。但它可以通過按長度遞減訂單來解決:$ AAPL $ A => {TICKER} {TICKER} :)謝謝! – Pr0no 2012-02-09 15:09:03

+0

夠公平的..如果這是一個有效的問題,我可以看到'失敗'。謝謝。 – Dutchie432 2012-02-09 17:43:42

1

您可能正在尋找 \b字邊界 如果「行情」將永遠只是大寫字母串,這應該足夠了:

<?php 
$str = '$MRK - Merck - ($AAPL, $MSFT, $F) having day $AA! like $P and me :)'; 
echo preg_replace('#\$[A-Z]+#', '{TICKER}', $str), "\n"; 

輸出:

{TICKER} - Merck - ({TICKER}, {TICKER}, {TICKER}) having day {TICKER}! like {TICKER} and me :) 
+0

'\ b'當你有'[AZ] +'。 – Ryan 2012-02-09 15:07:14

+0

@minitech:是的,它還早。 :-) – FtDRbwLXw6 2012-02-09 15:08:44