如何在字符串中找到所有$ tickers?

时间:2012-02-09 14:57:51

标签: php regex

考虑以下字符串:

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

虽然这是乱七八糟的,但它显示了我的问题。我想扫描以美元符号($)开头的所有单词,并根据预定义的代码列表进行检查。如果匹配,请用标签({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}感到高兴)。我如何解决所有这些可能的情况?

3 个答案:

答案 0 :(得分:1)

更改此代码的缺点是什么

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

到此?

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

无论在自动收报机之前或之后发生什么,这样做都会进行此更改。

答案 1 :(得分:1)

使用正则表达式:

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

答案 2 :(得分: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 :)