Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在字符串中识别所有的$ticker?_Php_Regex - Fatal编程技术网

Php 如何在字符串中识别所有的$ticker?

Php 如何在字符串中识别所有的$ticker?,php,regex,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 {TICK

考虑以下字符串:

$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前面只有一个空格)或(此股票被逗号包围:my,$AA,股票)。但是,两个紧随其后的股票代码(对$AA$XOM感到高兴)应该变成(对{TICKER}{TICKER}感到高兴)。我如何处理所有这些可能的情况?

更改此代码的缺点是什么

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

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

这样做将进行此更改,而不管在股票代码之前或之后是什么。

更改此代码的缺点是什么

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

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

这样做将进行此更改,无论在股票代码之前或之后是什么。

使用正则表达式:

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

使用正则表达式:

preg_replace('/\$[A-Z]+/', '{TICKER}', $tweet);
您可能正在查找
\b
单词边界,如果“tickers”始终是一串大写字母,那么这就足够了:

<?php
$str = '$MRK - Merck - ($AAPL, $MSFT, $F) having day $AA! like $P and me :)';
echo preg_replace('#\$[A-Z]+#', '{TICKER}', $str), "\n";
您可能正在查找
\b
单词边界,如果“tickers”始终是一串大写字母,那么这就足够了:

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


第八天,天空中伟大的处理器创造了正则表达式。他看了看他所创造的一切,一切都很好。您将需要比简单字符串替换更复杂的东西。欢迎来到模式匹配的世界。在第八天,天空中伟大的处理器创造了正则表达式。他看了看他所创造的一切,一切都很好。您将需要比简单字符串替换更复杂的东西。欢迎来到模式匹配的世界。
$AAPL$A
->
{TICKER}APL{TICKER}
首先我想:我真傻,竟然不去想Dutchie432说的话。然后我看到了同样的问题。但是它可以通过按长度desc排序ticker来解决:$AAPL$A=>{ticker}{ticker}:)谢谢!很公平。。如果这是一个合理的问题,我可以看到
失败
。谢谢。
$AAPL$A
->
{TICKER}APL{TICKER}
首先我想:我真傻,竟然不去想Dutchie432说的话。然后我看到了同样的问题。但是它可以通过按长度desc排序ticker来解决:$AAPL$A=>{ticker}{ticker}:)谢谢!很公平。。如果这是一个合理的问题,我可以看到
失败
。谢谢。
\b
当你有
[A-Z]+
@minitech:是的,现在还早。:-)
\b
当你有
[A-Z]+
@minitech:是的,时间还早。:-)感谢关于我的信息,如果你看看Dutchie432的答案(以及下面的评论),使用正则表达式会有我现在没有看到的任何优势吗?@Reveller:你甚至不需要查询数据库就可以使用它;例如,将以{TICKER:MRK}的形式返回匹配的模式,但是$1不返回任何内容?你能解释一下吗?@Reveller:你没有任何团体。将其更改为
preg\u replace('/\$([A-Z]+)/','{TICKER:$1}',$tweet)谢谢!关于我的信息,如果你看看Dutchie432的答案(以及下面的评论),使用正则表达式会有我现在没有看到的任何优势吗?@Reveller:你甚至不需要查询数据库就可以使用它;例如,将以{TICKER:MRK}的形式返回匹配的模式,但是$1不返回任何内容?你能解释一下吗?@Reveller:你没有任何团体。将其更改为
preg\u replace('/\$([A-Z]+)/','{TICKER:$1}',$tweet)