我想知道字符串中有多少个字母/数字,标点符号和'$'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也匹配'$'。
答案 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