str="aaadfasd"
alert(/([a-z\d_]{3,15}[a-z\d])|([\u0391-\uFFE5]{2,8})/.test(str))
str="抽烟的男人"
alert(/([a-z\d_]{3,15}[a-z\d])|([\u0391-\uFFE5]{2,8})/.test(str))

解决方案 »

  1.   

    $s = "1sdfsdfaa";if (preg_match('/^(?!\d{16}|.*_$)(\w{4,16}|([\xa0-\xff][\xa0-\xff]){2,8})$/',$s)) {
    echo "matched";
    } else {
      echo "un-matched";
    }
      

  2.   

    ^((\d*[a-z_\u4e00-\u9fa5]+)|([a-z_\u4e00-\u9fa5]+\d+))+$
    正则不是万能的,这个正则可以满足
    英文小写、汉字、数字、下划线,不能全部是数字。但是其它条件无法满足,本来以为使用前瞻可以满足下划线不能在末尾,但是没成功,不知道怎么回事。4-16个字符(包括4、16)或2-8个汉字这个条件比较难满足,除非分几个正则实现,或者是我比较笨,反正没弄出来...
      

  3.   

    3楼的强悍...
    但是中文好像不大对,或者在PHP里是正确的?我用JS来检测中文老是返回false
    做了点小改动,不知道满足楼主的条件了没有...
    ^(?!\d{16}|.*_$)(\w{4,16}|([\u4e00-\u9fa5]){2,8})$
      

  4.   

    ^(?!\d{16}|.*_$)([a-z_0-9]{4,16}|([\u4e00-\u9fa5]){2,8})$再做点改动,原来的大写也能匹配,现在只匹配英文小写,下划线,数字,中文了
      

  5.   

    ^(?!^\d+$|.*_$)([a-z_0-9]{4,16}|([\u4e00-\u9fa5]){2,8})$
    -----------
    好像成功了?
      

  6.   

    哈哈,那个整天淫荡在CsDn门外我也知道了,总结起来如下,测试通过^(?!([^\w{3,15}[a-zA-Z0-9]]|\d{4,16}))|([\u4e00-\uFFE5]{2,8})$(非(非【字母或数字或下划线3-15个、最后是一个字母或数字】 或者 全是数字))|汉字{2,8}原来[]()还可以嵌套着用的