hvalidator模块,c++提速node验证
发布于 12 年前 作者 DoubleSpout 8682 次浏览 最后一次编辑是 8 年前

最近研究C++ ADDON,参照着node-validator模块的功能山寨了一把,写成了c++形式的,介绍给大家: node.js版本的node-validator地址:https://github.com/chriso/node-validator c++版本的node-hvalidator地址:https://github.com/DoubleSpout/node-hvalidator 我们可以利用以下命令安装

npm install hvalidator

我也装下13,人家都在redis前加个h,我也在原来的validator前加个h,所以取名为:hvalidator。

目前这个模块只是完成了isxxx功能的coding,开发过程中最坑爹就是c++的正则模块了。为了速度,我选择了最原生的regex.h这个标准库,很多c++开发者都没用过,网上资料都少的可怜,大部分使用的boost库。

相关C++正则库对比文章地址:http://www.cnblogs.com/pmars/archive/2012/10/24/2736831.html

这个逆天的坑爹库直接让我给它跪了,为了写个正则表达式匹配得写上10几行代码,而且还有各种的配置,可能是我个人水平有限,花了一个晚上才搞清楚怎么使用它,刚开始各种不匹配,泪崩啊!!让我精疲力尽啊,几次都想放弃了。 最后终于我还是看懂了文档,为regex.h在编译的时候加上了REG_NOSUB选项,加速匹配。

目前这个hvalidator的正则不支持中文,而且过滤的功能还没写完,判断的部分开发完毕了,c++代码写的很差,希望大牛们指点一二啊。 最后献上测试代码,我们看下hvalidator的性能吧: 我们看下最后的执行结果,多次执行:

nodejs: 8ms
c++: 2ms
nodejs: 9ms
c++: 2ms
nodejs: 8ms
c++: 1ms
nodejs: 10ms
c++: 2ms
nodejs: 8ms
c++: 3ms

测试代码如下:

var hv = require('../index.js');
var nv = require('validator').check;

console.time('nodejs')

 nv('aaaa11[@aaaa](/user/aaaa).com').is(/[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$/)

 nv('123').isNumeric()

 nv(122.2).isFloat()
 
 nv('123').isInt()

 nv('aa').notEmpty()

 nv(new Date()).isDate()

 nv('abc').isAlpha()

 nv('abc').isLowercase()

 nv('ABC').isUppercase()

 nv('ABC').isIn('ABCDEFG')

 nv('123').isIn('123456789')

 nv('ABC').isIn(['ABCDEFG','123','234','ABC'])

 nv('234').isIn(['ABCDEFG','123','234','abc'])

 nv('sfsd[@fsfas](/user/fsfas).com').isEmail()

 nv('http://bbs.csdn.net/topics/270080323/').isUrl()

 nv('10.10.10.10').isIP()

 console.timeEnd('nodejs')


 console.time('c++')

 hv.is('aaaa11[@aaaa](/user/aaaa).com',/[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$/)

 hv.isArray([])

 hv.isRegExp(/\d/)

 hv.isNumber(123)

 hv.isPositive(122.2)
 
 hv.isInt(123)

 hv.notEmpty("aa")

 hv.isDate(new Date())

 hv.isString('abc')

 hv.isLowercase('abc')

 hv.isUppercase('ABC')

 hv.isIn('ABC','ABCDEFG')

 hv.isIn(123,'123456789')

 hv.isIn('ABC',['ABCDEFG','123','234','ABC'])

 hv.isIn(234,['ABCDEFG','123','234','abc'])

 hv.isLen('ABC',1,5)

 hv.isLen(5,1,5)

 hv.isLen([1,2,3],1,5)

 hv.isEmail('sfsd[@fsfas](/user/fsfas).com')

 hv.isUrl('http://bbs.csdn.net/topics/270080323/')

 hv.isIp('10.10.10.10')

console.timeEnd('c++')
24 回复

mark留用…snoopy大niubility…

感谢捧场啊,可惜人气不旺啊,之前一篇也是你捧的场哇,谢谢啊

收藏了。人气不旺,是把你当神拜了。。仰望一下。

不错不错,好玩

有这功夫,写个 Oracle Nodejs 驱动不好嘛,造福一下广大 Node-er

底层可以用 ocilib (http://www.ocilib.net),

过奖了啊,这个东西也是边学边写的

挺好玩的吧

c++ addon我也是刚学着写写,这oracle驱动实在搞不定啊

不是说这是C++模块么,在Windows下安装木有编译啊?

> require('hvalidator')
Error: Cannot find module '../addon/build/Release/verify.node'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:362:17)
    at require (module.js:378:17)
    at Object.<anonymous> (f:\github\node_modules\hvalidator\lib\verify.js:1:80)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:362:17)

我2了,忘记把编译加上去了

自己进去addon目录用node-gyp编译,提示木有regex.h文件

f:\github\node_modules\hvalidator\addon>node-gyp rebuild
gyp info it worked if it ends with ok
gyp info using node-gyp@0.7.2
gyp info using node@0.8.14 | win32 | ia32
gyp info spawn python
gyp info spawn args [ 'C:\\Users\\leizongmin\\.node-gyp\\0.8.14\\tools\\gyp\\gyp',
gyp info spawn args   'binding.gyp',
gyp info spawn args   '-f',
gyp info spawn args   'msvs',
gyp info spawn args   '-G',
gyp info spawn args   'msvs_version=2010',
gyp info spawn args   '-I',
gyp info spawn args   'f:\\github\\node_modules\\hvalidator\\addon\\build\\config.gypi',
gyp info spawn args   '-I',
gyp info spawn args   'C:\\Users\\leizongmin\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\addon.gypi',
gyp info spawn args   '-I',
gyp info spawn args   'C:\\Users\\leizongmin\\.node-gyp\\0.8.14\\common.gypi',
gyp info spawn args   '-Dlibrary=shared_library',
gyp info spawn args   '-Dvisibility=default',
gyp info spawn args   '-Dnode_root_dir=C:\\Users\\leizongmin\\.node-gyp\\0.8.14',
gyp info spawn args   '-Dmodule_root_dir=f:\\github\\node_modules\\hvalidator\\addon',
gyp info spawn args   '--depth=.',
gyp info spawn args   '--generator-output',
gyp info spawn args   'f:\\github\\node_modules\\hvalidator\\addon\\build',
gyp info spawn args   '-Goutput_dir=.' ]
gyp info spawn C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe
gyp info spawn args [ 'build/binding.sln',
gyp info spawn args   '/clp:Verbosity=minimal',
gyp info spawn args   '/nologo',
gyp info spawn args   '/p:Configuration=Release;Platform=Win32' ]
  SimpleVerify.cc
  verify.cc
..\SimpleVerify.cc : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据
丢失 [f:\github\node_modules\hvalida
tor\addon\build\verify.vcxproj]
D:\Program Files\Microsoft Visual Studio 10.0\VC\include\xlocale(323): warning C4530: 使用了 C++ 异常处理程序,但未启用
展开语义。请指定 /EHsc
 [f:\github\node_modules\hvalidator\addon\build\verify.vcxproj]
D:\Program Files\Microsoft Visual Studio 10.0\VC\include\xlocale(323): warning C4530: 使用了 C++ 异常处理程序,但未启用
展开语义。请指定 /EHsc
 [f:\github\node_modules\hvalidator\addon\build\verify.vcxproj]
..\SimpleVerify.cc(6): fatal error C1083: 无法打开包括文件:“regex.h”: No such file or directory [f:\github\node_module
s\hvalida
tor\addon\build\verify.vcxproj]
C:\Users\leizongmin\.node-gyp\0.8.14\deps\v8\include\v8.h(183): warning C4506: 内联函数“v8::Persistent<T> v8::Persisten
t<T>
::New(v8::Handle<T>)”没有定义 [f:\github\node_modules\hvalidator\addon\build\verify.vcxproj]
          with
          [
              T=v8::Object
          ]
gyp ERR! build error
gyp ERR! stack Error: `C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onExit (C:\Users\leizongmin\AppData\Roaming\npm\node_modules\node-gyp\lib\build.js:23
2:23)
gyp ERR! stack     at ChildProcess.EventEmitter.emit (events.js:99:17)
gyp ERR! stack     at Process._handle.onexit (child_process.js:678:10)
gyp ERR! System Windows_NT 6.1.7601
gyp ERR! command "node" "C:\\Users\\leizongmin\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuil
d"
gyp ERR! cwd f:\github\node_modules\hvalidator\addon
gyp ERR! node -v v0.8.14
gyp ERR! node-gyp -v v0.7.2
gyp ERR! not ok

这个regex.h是只有linux有的,还要去下个,我在vs2012下也没找到这个东西。现在已经加进去了,可以npm直接编译了,汗。。

@snoopy 不客气啦。

话说之前发你一封关于nodebb的邮件,不知收到了没?

@phoenixlzx 好像没收到啊

HOHO~搞定了,windows下也支持了,尼玛跨平台真蛋疼

没关系,我C++也是菜鸟一只~

@snoopy 垃圾邮件里呢?

如果真没收到就算了,就是我在用express写一个论坛程序,但是发现node和平时网页里的js还不太一样于是又看书去了…希望得到一点指导。项目地址: https://geakit.com/phoenixlzx/nodebb

@phoenixlzx 你这个项目里什么都没有啊,都是空方法啊

@snoopy 果然可以。snoopy大大威武,哈哈

@snoopy 我就说嘛…只有一个空的express,具体的实现都没有写。

因为发现node和以前写过的js不太一样,所以还在看书…snoopy大能指导下就最好了

@leizongmin 不过windows的那个正则对传入的js正则有点不兼容。

@phoenixlzx 是有些区别的啊,有我QQ吗?有什么问题Q聊吧,不要这里叠楼啦~

LZ很牛掰啊|!

回到顶部