对照数组检查字符串中的股票行情


Check stock tickers in string against array

考虑以下数组,该数组包含按长度排序的所有美国股票代码:

$tickers = array('AAPL', 'AA', 'BRK.A', 'BRK.B', 'BAE', 'BA'); // etc...

我想检查字符串中所有可能的匹配项。Tickers的前面连接有或没有"$":

$string = "Check out $AAPL and BRK.A, BA and BAE.B - all going up!";

所有股票代码的标签如下:{TICKER:XX}。预期输出为:

Check out {TICKER:AAPL} and {TICKER:BRK.A} and BAE.B - all going up!

因此,应该对照$tickers数组检查tickers,如果它们后面跟着空格或逗号,则两者都匹配。到目前为止,我一直在使用以下内容:

preg_replace('/'$([a-zA-Z.]+)/', ' {TICKER:$1} ', $string);

所以我不必查看$tickers数组。假设所有股票代码都以"$"开头,但这似乎只是大约80%的情况下的惯例。因此,需要更新过滤器。

我的问题是:有没有一种简单的方法来调整正则表达式以符合新的要求,或者我需要像我最初计划的那样编写一个新的函数:

function match_tickers($string) {
  foreach ($tickers as $ticker) {
    // preg_replace with $
    // preg_replace without $
  }
}

或者这可以一次完成吗?

只需使用?(零或1个匹配项)使前导美元符号可选即可。然后,您可以使用相同的技术检查合法的尾随字符。更好的方法是explode输入字符串,并根据ticker集合检查/替换每个子字符串,然后重建输入字符串。

 function match_tickers($string) {
      $aray = explode( " ", $string );
      foreach ($aray as $word) {
           // extract any ticker symbol
           $symbol = preg_replace( '/^'$?([A-Za-z]?'.?[A-Za-z])'W*$/', '$1', $word );
           if (in_array($symbol,$tickers)) { // symbol, replace it
               array_push( $replacements, preg_replace( '/^'$?([A-Za-z]?'.?[A-Za-z])('W*)$/', '{TICKER:$1}$2', $word ) );
           }
           else { // not a symbol, just output it normally
               array_push( $replacements, $word );
           }
       }
       return implode( " ", $replacements );
 }

我认为只要对正则表达式做一点小小的更改就可以了:

'$?([a-zA-Z.]+)

我在"$"前面加了"?",这意味着它可以出现0或1次

您可以在数组上使用单个foreach循环来替换字符串中的ticker项。

$tickers = array('AAPL', 'AA', 'BRK.A', 'BRK.B', 'BAE', 'BA');
$string = 'Check out $AAPL and BRK.A, BA and BAE.B - all going up!';
foreach ($tickers as $ticker) {
    $string = preg_replace('/('$?)'b('.$ticker.')'b(?!'.[A-Z])/', '{TICKER:$2}', $string);
}
echo $string;

将输出

查看{TICKER:APL}和{TICKER:BRK.A}、{TICKR:BA}和BAE.B-都上去了!

$符号后添加?也将接受单词,即"out"

preg_replace接受数组作为一种模式,所以如果您将$tickers数组更改为:$tickers = array('/AAPL/', '/AA/', '/BRK.A/', '/BRK.B/', '/BAE/', '/BA/');

那么这应该起作用:preg_replace($tickers, ' {TICKER:$1} ', $string);

这是根据http://php.net/manual/en/function.preg-replace.php