正则纠结中……

[^\f\n\r\t\v] <=> \S ,是否真的等同?
去掉[^\f\n\r\t\v],$s2中的空格去不了,加上以后,什么都不匹配……

function checkString($str){
//去掉非英文以外的其他语言包括乱码、空格。需要英文加特殊符号的内容
if(preg_match("/^ [ [:alnum:] [:space:] [:punct:] [^\f\n\r\t\v]]+ $/x",$str)){
return $str;
}else{
echo "含非匹配项";
}
}
$s1 = "!!!!!!!";
$s2 = "1 1 1 1 1 1 1";
$s3 = "123asd";
echo checkString($s1)."<br>";
echo checkString($s2)."<br>";
echo checkString($s3)."<br>";

/*输出
含非匹配项
含非匹配项
含非匹配项
*/

还有,将[]改成(),再加个第三参数$res,没有获取到结果集。如:

if(preg_match("/^( [ [:alnum:] [:space:] [:punct:]]+ )$/x","11111111",$res)){
print_r($res);
}else{
echo "含非匹配项"; //输出在这里
}
...全文
839 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 的回复:]

PHP code
<?php
$psw = "a 2 sw\fd 11\t11 11 *@\n#4_\r) \v-+?~'";
preg_match_all('/([\s[:punct:]]|((.)\3))/',$psw,$matches);
echo str_replace($matches[0],$matches[2],$psw),'<br>';

$condition=array(
……
[/Quote]
终于解决,感谢各位支持!
找到有关[:punct:]的用法了:http://hi.baidu.com/yxhsunshine/blog/item/2e3f3458396c1ada9c8204b8.html
赵4老师 2012-04-13
  • 打赏
  • 举报
回复
推荐使用regtest软件
代码如诗 2012-04-13
  • 打赏
  • 举报
回复
<?php
$psw = "a 2 sw\fd 11\t11 11 *@\n#4_\r) \v-+?~'";
preg_match_all('/([\s[:punct:]]|((.)\3))/',$psw,$matches);
echo str_replace($matches[0],$matches[2],$psw),'<br>';

$condition=array(
"\t"=>'含制表符:\t',
"\f"=>'含换页符:\f',
"\r"=>'含回车符:\r',
"\n"=>'含换行符:\n',
"\v"=>'含垂直制表符:\v',
);
foreach ($matches[0] as $v){
if (in_array($v,array_keys($condition))) echo $condition[$v],'<br>';
if (preg_match('/([[:punct:]])/',$v)) echo '含特殊字符',$v,'<br>';
if (preg_match('/(.)\1/',$v)) echo '含重复字符',$v,'<br>';
}
/*
a2swd1111114
含换页符:\f
含重复字符11
含制表符:\t
含重复字符11
含重复字符11
含特殊字符*
含特殊字符@
含换行符:\n
含特殊字符#
含特殊字符_
含回车符:\r
含特殊字符)
含特殊字符-
含特殊字符+
含特殊字符?
含特殊字符~
含特殊字符'
*/
  • 打赏
  • 举报
回复

([\s*@#_)-])|((.)\\3+)

这个灵活度不够啊,如果像"?+~,还得手动添加吗,难道没有直接表示标点字符、特殊字符的正则吗?
zongqinglove 2012-04-13
  • 打赏
  • 举报
回复
正在接触PHP
  • 打赏
  • 举报
回复

$psw = "a 2 sw\fd 11\t11 11 *@\n#4_\r) \v-";
preg_match_all("/([\s*@#_)-])|((.)\\3+)/", $psw, $r);
//print_r($r);echo"<br>";
foreach($r as $s => $res){
foreach($res as $e => $rest){
if($rest == "\t") echo "{$s}-{$e}含制表符:\\t<br>";
if($rest == "\f") echo "{$s}-{$e}含换页符:\\f<br>";
if($rest == "\r") echo "{$s}-{$e}含回车符:\\r<br>";
if($rest == "\n") echo "{$s}-{$e}含换行符:\\n<br>";
if($rest == "\v") echo "{$s}-{$e}含垂直制表符:\\v<br>";
//这里怎么表示?if(preg_match_all('/(.)\1\1/',$rest,$matches)) echo "{$s}-{$e}含重复字符:{$matches[0]}<br>";
//这里怎么表示?if(preg_match_all('/(.)\1\1/',$rest,$matches)) echo "{$s}-{$e}含特殊字符:{$matches[0]}<br>";
$result[$s][] = htmlentities($rest);
}
}
print_r($result);
/* printout:
0-2含换页符:\f
0-5含制表符:\t
0-12含换行符:\n
0-15含回车符:\r
1-2含换页符:\f
1-5含制表符:\t
1-12含换行符:\n
1-15含回车符:\r
*/
Array ( [0] => Array ( [0] => [1] => [2] => [3] => [4] => 11 [5] => [6] => 11 [7] => [8] => 11 [9] => [10] => * [11] => @ [12] => [13] => # [14] => _ [15] => [16] => ) [17] => [18] => - ) [1] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] => [9] => [10] => * [11] => @ [12] => [13] => # [14] => _ [15] => [16] => ) [17] => [18] => - ) [2] => Array ( [0] => [1] => [2] => [3] => [4] => 11 [5] => [6] => 11 [7] => [8] => 11 [9] => [10] => [11] => [12] => [13] => [14] => [15] => [16] => [17] => [18] => ) [3] => Array ( [0] => [1] => [2] => [3] => [4] => 1 [5] => [6] => 1 [7] => [8] => 1 [9] => [10] => [11] => [12] => [13] => [14] => [15] => [16] => [17] => [18] => ) )

//这里怎么表示?if(preg_match_all('/(.)\1\1/',$rest,$matches)) echo "{$s}-{$e}含重复字符:{$matches[0]}<br>";
//这里怎么表示?if(preg_match_all('/(.)\1\1/',$rest,$matches)) echo "{$s}-{$e}含特殊字符:{$matches[0]}<br>";
xuzuning 2012-04-13
  • 打赏
  • 举报
回复
preg_match_all("/([\s*@#_)-])|((.)\\3+)/", $psw, $r);
print_r($r);


Array
(
[0] => Array
(
[0] =>
[1] =>
[2] =>
[3] =>
[4] => 11
[5] =>
[6] => 11
[7] =>
[8] => 11
[9] =>
[10] => *
[11] => @
[12] =>

[13] => #
[14] => _
[15] =>
[16] => )
[17] =>
[18] => -
)

[1] => Array
(
[0] =>
[1] =>
[2] =>
[3] =>
[4] =>
[5] =>
[6] =>
[7] =>
[8] =>
[9] =>
[10] => *
[11] => @
[12] =>

[13] => #
[14] => _
[15] =>
[16] => )
[17] =>
[18] => -
)

[2] => Array
(
[0] =>
[1] =>
[2] =>
[3] =>
[4] => 11
[5] =>
[6] => 11
[7] =>
[8] => 11
[9] =>
[10] =>
[11] =>
[12] =>
[13] =>
[14] =>
[15] =>
[16] =>
[17] =>
[18] =>
)

[3] => Array
(
[0] =>
[1] =>
[2] =>
[3] =>
[4] => 1
[5] =>
[6] => 1
[7] =>
[8] => 1
[9] =>
[10] =>
[11] =>
[12] =>
[13] =>
[14] =>
[15] =>
[16] =>
[17] =>
[18] =>
)

)
  • 打赏
  • 举报
回复
$psw = "a 2 sw\fd 11\t11 11 *@\n#4_\r) \v-";
  • 打赏
  • 举报
回复
咕~~(╯﹏╰)b,
preg_replace(array('/(\s+)/', '/(.)\\1+/'), array('', '$1'), $s);

怎么用preg_match_all()表示,因为我想加判断,比如在验证密码的时候不可能将用户的原密码进行裁剪,只要判断出有重复值和含空格就行:

$psw = "a 2 sw\fd 11\t11 11 *@\n#4_\r) \v-";
if(preg_match_all($pattern,$psw,$res)){
print_r($res); //获取到 a2swd1111114,这样能实现吗?,实在不行是获取a2swd14也行
return $res;
}else{
//将非匹配项罗列出来,添加提示
echo "包含重复字符:111111";
echo "包含特殊字符:*@#_)-";
echo "包含空格";
echo "包含制表符:\t";
echo "包含换页符:\f";
echo "包含回车符:\r";
echo "包含换行符:\n";
echo "包含垂直制表符:\v";
}

这样能实现吗?
xuzuning 2012-04-12
  • 打赏
  • 举报
回复
$s = "1 2 3 4444";

//过滤空格的正则
echo preg_replace('/\s+/', '', $s);//1234444

//过滤重复字符的正则
echo preg_replace('/(.)\\1+/', '$1', $s);//1 2 3 4

//和在一起
echo preg_replace(array('/(\s+)/', '/(.)\\1+/'), array('', '$1'), $s);//1234
  • 打赏
  • 举报
回复
这样简单点吧,先说说怎么将过滤空格的正则和过滤重复字符的正则和在一起:

if(preg_match_all("/([^\f\n\r\t\v][(.)\1\1]+)/","1 2 3 4444",$res))
{
print_r($res);
}else{
echo "含非匹配项"; //这里输出
}
foolbirdflyfirst 2012-04-12
  • 打赏
  • 举报
回复
嗯,然后加上判断是否有重复字符的,可能必须得循环了,一句正则就出来你要的结果我暂时没想到有什么方法。
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

第一个问题就说你想留下什么吧
第二个:PHP code
if(preg_match('/(.)\1\1/',$str,$matches))
echo '不能有连续三位相同';
[/Quote]
第二个我试过了,可以。
第一个描述的不清楚吗?字符串中,除了换页符、换行符、回车符、空格、制表符、垂直制表符、特殊字符(!$@#……),其它都留下。
[Quote=引用 13 楼 的回复:]
你用preg_match肯定只匹配第一个匹配的串,用preg_match_all
[/Quote]
这个的确得到了,谢谢。
Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4444 ) [1] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4444 ) )
foolbirdflyfirst 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

PHP code

if(preg_match("/([^ \f\n\r\t\v]+)/","1 2 3 4444",$res))
{
print_r($res);
}
//输出
Array ( [0] => 1 [1] => 1 ) //2 3 4444呢?


还用,请帮忙回答:
1、可过滤换页符、换行符、回车符、空格、制表符、垂直制表符、特殊字符,正则表达式:?
2、如果在1……
[/Quote]
你用preg_match肯定只匹配第一个匹配的串,用preg_match_all
代码如诗 2012-04-12
  • 打赏
  • 举报
回复
第一个问题就说你想留下什么吧
第二个:
if(preg_match('/(.)\1\1/',$str,$matches))
echo '不能有连续三位相同';
  • 打赏
  • 举报
回复

if(preg_match("/([^ \f\n\r\t\v]+)/","1 2 3 4444",$res))
{
print_r($res);
}
//输出
Array ( [0] => 1 [1] => 1 ) //2 3 4444呢?

还用,请帮忙回答:
1、可过滤换页符、换行符、回车符、空格、制表符、垂直制表符、特殊字符,正则表达式:?
2、如果在1的条件下不能有连续3位相同的呢,正则表达式:?
foolbirdflyfirst 2012-04-12
  • 打赏
  • 举报
回复
你加x修正符然后正则里还有空格符,这不是白用x了么?
if(preg_match("/([^ \f\n\r\t\v]+)/","1 2 3 4444",$res))
{
print_r($res)
}
foolbirdflyfirst 2012-04-12
  • 打赏
  • 举报
回复
你按space键位的那个空格你都没包含进来,恰巧你的串里的空格是space那个,有点晕了吧,呵呵。
ascii码
--------------
space -> 32
\n -> 10
\t -> 9
\f -> 12
\r -> 13
\v -> 11

  • 打赏
  • 举报
回复
晕菜,我在网上找的一个介绍正则表达式的内容是这样写的:
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。
\S 匹配任何非空白字符。等价于[^\f\n\r\t\v]。

现在才知道:浮云太多也是会漏水的!!!
那么这样怎么实现?
目的:
1、可过滤换页符、换行符、回车符、空格、制表符、垂直制表符、特殊字符,正则表达式:?
2、如果在1的条件下不能有连续3位相同的呢,正则表达式:?
xuzuning 2012-04-12
  • 打赏
  • 举报
回复
if(preg_match("/^( [^\s]+ )/x","1 1 1 11111",$res)){
print_r($res);
}else{
echo "含非匹配项";
}
Array
(
[0] => 1
[1] => 1
)

加载更多回复(5)

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧