【问题标题】:Counting the number of specific characters inside string计算字符串中特定字符的数量
【发布时间】:2013-04-23 06:47:30
【问题描述】:

对不起,由于我的问题,我刚刚发现了一个新问题: Get The Number of Sepecific String Inside String.

我一直在努力,如何找到字符串中特定字符的个数?情况是这样的。

function get_num_chars($char) {
    $string = '120201M, 121212M-1, 21121212M, 232323M-2, 32323K, 323232K-1'
}

如果我通过get_num_chars(M) would return 2 如果我通过get_num_chars(M-1) would return 1

我尝试了count_chars()substr_count(),但它不起作用。

【问题讨论】:

  • 问题是当某些东西包含K-1时,它也包含K。函数应该如何知道不计算这些?您需要更仔细地定义问题。
  • @Barmar:OP 没有指定 K-1 不应该匹配?
  • @Aquillo 他确实指定了...他希望 if (M) 返回 2,如果 (M-1) 返回 1....“Barmar”是正确的。
  • 哦,对不起。在这种情况下,您最好计算正则表达式的匹配项,例如 count matches of char not followed by dashcount matches of char followed by comma or end of line
  • 我只是虽然解决方案是使用正则表达式来区分出现的“K”(K 后面没有“-1”)和 K-1(K 后面跟着-1)。正则表达式怎么写?

标签: php string


【解决方案1】:

substr_count() 可以。

我认为你没有正确地传递一个值。试试这样:

$string = '120201M, 121212M-1, 21121212M, 232323M-2, 32323K, 323232K-1';

echo substr_count($string, 'K-1'); //echo's 1

echo substr_count($string, 'K'); // echo's 2

【讨论】:

  • 他希望第二个回显1,而不是2
  • 是的。巴尔马尔是对的。搜索“K”时,排除“K-1”。所以, substr_count($string, 'K') 应该是 1
  • 可能的解决方案:$string = str_replace('K-1', '', $string)K-1 被计数后。
  • 正如其他人所说,在较大的子字符串中存在针字符串的情况下,此答案将产生不正确的结果。
【解决方案2】:

使用正则表达式的可能解决方案:

function get_num_chars($char) {
    $string = '120201M, 121212M-1, 21121212M, 232323M-2, 32323K, 323232K-1';
    return preg_match_all('/'.$char.'(?=,|$)/', $string, $m);
}

echo get_num_chars('M');    // 2
echo get_num_chars('M-1');  // 1
echo get_num_chars('M-2');  // 1
echo get_num_chars('K');    // 1
echo get_num_chars('K-1');  // 1

【讨论】:

  • 在 regular-expression.info 上查找“环视”
  • 如果字符串的大小非常大,这将失败。
  • @Munt 请描述“非常高”。
  • @mickmackusa 可能是非常大的字符串?因为我不再使用 PHP,所以我忘记了我的意思。
  • 如果您只是要返回匹配计数,则声明 $m 没有任何好处。
【解决方案3】:
$k_count = substr_count($string, 'K') - substr_count($string, 'K-');
$k1_count = substr_count($string, 'K-1');

Counting K not followed by dash如下:

$k_count = preg_match_all('/*K(?!-)/*', $string, $out);

【讨论】:

  • 我认为你没有测试你的正则表达式。
【解决方案4】:

试试这个。这可能不可行,但它解决了您的问题。

function get_num_chars($char) {

    $string = '120201M, 121212M-1, 21121212M, 232323M-2, 32323K, 323232K-1';
    echo substr_count($string, $char);
}

get_num_chars('M,');
get_num_chars('M-1');
get_num_chars('k,');

【讨论】:

  • 如果最后一个字符集以K 结尾呢?结尾没有逗号。
  • 如前所述,搜索 K 的字符串也会匹配 K-1。所以编码员需要彻底检查他的输入。
  • 是的,但是说$string = '120201M, 121212M-1, 21121212M, 232323M-2, 32323K, 323232K-1, 2323K';。最后一个条目不会被'K,'匹配
  • 很容易解决。添加填充 $string .= ',',然后使用 rtrim 将其删除(如果其他地方需要 $string)。
  • 如本页其他地方所述,如果针串存在于较大的子串中,此答案将产生不正确的结果。
【解决方案5】:

试试这个:

 $string = '120201M, 121212M-1, 21121212M, 232323M-2, 32323K, 323232K-1';

 $wordCounts = array_count_values(str_word_count($string,1));

 echo $mCount = (isset($wordCounts['M-'])) ? $wordCounts['M'] : 0;

但这是一回事。您可以只传递“M-”或“M”,而不是“M-1”。这是您想要的一些解决方法。因为 str_word_count 与正在使用的确切字数匹配。

【讨论】:

  • str_word_count() 破坏数据——因此M-1 是不可搜索的。证明:3v4l.org/i6VvF
猜你喜欢
  • 2018-07-23
  • 1970-01-01
  • 2014-01-30
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
相关资源
最近更新 更多