2011-02-03 44 views
1

在我的iPhone項目中,我需要通過使用Javascript函數或使用正則表達式來驗證字符串。iPhone - 使用UIWebView評估JavaScript和正則表達式

該代碼使用JavaScript和正則表達式從jQuery代碼進行了測試: http://docs.jquery.com/Plugins/Validation/Methods/email http://docs.jquery.com/Plugins/Validation/Methods/url http://docs.jquery.com/Plugins/Validation/Methods/date HTTP://docs.jquery。 COM /插件/確認/方法/ dateISO http://docs.jquery.com/Plugins/Validation/Methods/number http://docs.jquery.com/Plugins/Validation/Methods/digits http://docs.jquery.com/Plugins/Validation/Methods/creditcard

我搜索了一個完整的解決方案,可能錯過了,所以我決定挑選部分並實現NSString + JavaScript + RegEx ...

我已經張貼作爲下面的答案,在情況下,它的價值給任何人......

魯文

回答

2

這裏是代碼清單,希望對您有用:

// // NSString的+的JavaScript + RegEx.h //

@interface NSString(JavaScript_RegEx) 

// Built-in rules 
+ (NSArray*) emailRule; 
+ (NSArray*) urlRule; 
+ (NSArray*) dateRule; 
+ (NSArray*) dateISORule; 
+ (NSArray*) numberRule; 
+ (NSArray*) digitsRule; 
+ (NSArray*) creditcardRule; 

- (NSString*) javascriptValue; 
- (NSString*) regexTestValue:(NSString*)value; 

@end 

// //的NSString +的JavaScript + RegEx.m //

#import "NSString+JavaScript+RegEx.h" 

@implementation NSString(JavaScript_RegEx) 

static NSString* kUIWebViewWrapperForJS = @"(function() {\ntry {\n%@\n}\ncatch (err)\n{\nreturn err;\n}\n})();"; 
static NSString* kJSWrapperForRegEx = @"re = new RegExp(/%@/); return re.test('%@')"; 

+ (NSArray*) emailRule { 
    return [NSArray arrayWithObjects:[NSNumber numberWithInt:0], // 0=RegEx 
      @"^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$", 
      @"Please enter a valid email address.", 
      nil]; 
} 

+ (NSArray*) urlRule { 
    return [NSArray arrayWithObjects:[NSNumber numberWithInt:0], // 0=RegEx 
      @"^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$", 
      @"Please enter a valid URL.", 
      nil]; 
} 

+ (NSArray*) dateRule { 
    return [NSArray arrayWithObjects:[NSNumber numberWithInt:1], // 1=JS 
      @"return !/Invalid|NaN/.test(new Date(\"%@\"));", // expect a date 
      @"Please enter a valid date.", 
      nil]; 
} 

+ (NSArray*) dateISORule { 
    return [NSArray arrayWithObjects:[NSNumber numberWithInt:0], // 0=RegEx 
      @"^\\d{4}[\\/-]\\d{1,2}[\\/-]\\d{1,2}$", 
      @"Please enter a valid date.", 
      nil]; 
} 

+ (NSArray*) numberRule { 
    return [NSArray arrayWithObjects:[NSNumber numberWithInt:0], // 0=RegEx 
      @"^-?(?:\\d+|\\d{1,3}(?:,\\d{3})+)(?:\\.\\d+)?$", 
      @"Please enter a valid number.", 
      nil]; 
} 

+ (NSArray*) digitsRule { 
    return [NSArray arrayWithObjects:[NSNumber numberWithInt:0], // 0=RegEx 
      @"^\\d+$", 
      @"Please enter only digits.", 
      nil]; 
} 

+ (NSArray*) creditcardRule { 
    return [NSArray arrayWithObjects:[NSNumber numberWithInt:1], // 1=JS 
      @"// accept only digits and dashes\n" 
      "var value = \"%@\";\n" 
      "if (/[^0-9-]+/.test(value))\n" 
      " return false;\n" 
      "var nCheck = 0, nDigit = 0, bEven = false;\n" 
      "value = value.replace(/\\D/g, \"\");\n" 
      "for (var n = value.length - 1; n >= 0; n--) {\n" 
      " var cDigit = value.charAt(n);\n" 
      " var nDigit = parseInt(cDigit, 10);\n" 
      " if (bEven) {\n" 
      " if ((nDigit *= 2) > 9)\n" 
      "  nDigit -= 9;\n" 
      " }\n" 
      " nCheck += nDigit;\n" 
      " bEven = !bEven;\n" 
      "}\n" 
      "return (nCheck %% 10) == 0;", 
      @"Please enter a valid credit card number.", 
      nil]; 
} 

- (NSString*) javascriptValue { 
    NSString* jsForWebView = [NSString stringWithFormat:kUIWebViewWrapperForJS, self]; // convert to "JS-edible-by-UIWebView" 

    UIWebView *wb = [[[UIWebView alloc] init] autorelease]; 
    //NSLog(@"%s\n%@\n", __FUNCTION__, jsForWebView); 
    NSString* result = [wb stringByEvaluatingJavaScriptFromString:jsForWebView]; 
    return result; 
} 

- (NSString*) regexTestValue:(NSString*)value { 
    NSString* javascriptWrappedRegEx = [NSString stringWithFormat:kJSWrapperForRegEx, self, value]; 
    NSString* result = [javascriptWrappedRegEx javascriptValue]; 
    return result; 
} 

@end 

享受,魯文

0

您曾嘗試以下UIWebView實例方法?

- (NSString *) stringByEvaluatingJavaScriptFromString: (NSString *) script 
+0

是的,我有。在我的課程下面(我發佈了自己的問題的答案,希望對其他人有用......)我正在使用它。 – Reuven 2011-02-03 19:36:09

相關問題