在PHP中按类型计算字符串中的字母

时间:2014-01-14 04:47:41

标签: php regex

我想知道字符串中有多少个字母/数字,标点符号和'$'sings。 我正在使用preg_match_all尝试一组3个正则表达式:

假设我有一个字符串,例如$string = "abcde!@#$%$$";

计算$:我试过

$check = preg_match_all("/(\$)/", $string, $matches);

哪个应该给我3场比赛。但是var_dump $ matches在这里给我这个:

array ( 0 => array ( 0 > '', ), 1 => array ( 0 => '', ),)

同样地,我试图将所有字母和标点符号分别与模式'/(\w)/''/(\W)/'匹配,但在那里我没有得到任何匹配。为什么呢?

顺便说一下,我知道\ W也匹配'$'。

3 个答案:

答案 0 :(得分:2)

使用单引号,否则PHP会认为您要根据美元符号进行插值:

$check = preg_match_all('/(\$)/', $string, $matches);
                        ^      ^

应该这样做。此外,您不需要捕获组:'/\$/'

我认为其他正则表达式没有问题。 '/\W/'输出7,'/\w/'输出5.

答案 1 :(得分:1)

您可以将其合并为1个RegEx:/([\w])|([!,\.])|(\$)/

这将匹配1:字词(字母数字),2:标点符号(!,.或您添加到课程中的任何内容)和3:美元符号。然后,您可以遍历preg_match_all()以获取计数:

<?php
$alphanumeric = $punctuation = $dollar = 0;

if(preg_match_all('/([\w])|([!,\.])|(\$)/', 'abcde!@#$%$$', $matches)) {
    for($i = 1; $i <= 3; $i++) {
        $count = 0;
        foreach($matches[$i] as $match) {
            if($match)
              $count++;
        }

        switch($i) {
            case 1: $alphanumeric = $count; break;
            case 2: $punctuation = $count; break;
            case 3: $dollar = $count; break;
        }
    }
}

var_dump($alphanumeric); // int(5)
var_dump($punctuation); // int(1)
var_dump($dollar); // int(3)

显然,可以根据您的需要修改或添加3个匹配组([\w][!,\.]\$)。

答案 2 :(得分:1)

$str = "abcde!@#$%$$1234567";

$count_negated = array(
  'ALPHA' =>  '[^[:alpha:]]+',
  'ALNUM' =>  '[^[:alnum:]]+',
  'DIGITS' => '\D+',
  'DOLLAR' => '[^$]+',
  'PUNCT' =>  '[^[:punct:]]+'
);

foreach($count_negated AS $k => $v)
{
  echo "There are ".
        strlen(preg_replace('~'.$v.'~', "", $str))." ".$k.
        " in my string<br>";
}

输出

There are 5 ALPHA in my string
There are 12 ALNUM in my string
There are 7 DIGITS in my string
There are 3 DOLLAR in my string
There are 7 PUNCT in my string