【发布时间】:2011-08-14 06:40:37
【问题描述】:
我有一个允许添加自定义字段的 CMS 应用。一种类型的自定义字段是用户文本输入框。创建此字段类型时,您还可以提供一个 perl 正则表达式,用于 preg_match php 函数来验证此字段的用户输入。
现在我正在设置管理具有大量前端 jquery 幻想的数据的新方法,我遇到了这个问题。当动态生成表单(ajax/php)时,还会组装 JSON 字符串并将其与动态表单 HTML 一起添加到 ajax 响应数据中。接收 javascript 函数绘制 html 并解析包含字段信息的 JSON 字符串(它是什么类型的字段:文本或选择以及每个字段存在的其他字段选项。然后将此 JSON 对象附加到 jQuery 数据( ) 表单的#submitButton 方法。
当用户提交表单时,按钮的 data() 键会循环访问有关应检查哪个表单 id 以进行输入验证的信息,即 selectindex 不能为零并且文本字段必须根据提供的正则表达式模式进行验证.
我为 PHP 提供的正则表达式模式是:/^([A-Za-z0-9 .\-']*)$/,这在 php 中运行良好,我所描述的其余部分也运行良好。我的问题是我真的不擅长正则表达式,我不明白为什么这个模式通过 php 中的 preg_match 正确匹配,但在 javascript 中使用 string.match(pattern); 每次都失败,无论我给它什么输入。
这是一段sn-p代码:
var checklist = $('#ficb1').data(); // gets data() object.
var errors = new Array();
for(var key in checklist) { // loop through data() keys
// verify text field
if(checklist[key]["type"] == "text") { // do the following for text fields
if(checklist[key]["options"]) { // checks if a pattern is set
// found pattern! regex check!
var pattern = checklist[key]["options"]; // verfied value: /^([A-Za-z0-9 .\-']*)$/
var valstr = $('#'+key).val(); // key = id of field being checked without # sign valstr varified to hold the value of the input text.
if(!valstr.match(pattern)) {
// add error message to error array - regex match not found.
var engkey = key.replace('_', ' ');
errors.push(ucfirst(engkey.substr(1)) + ' did not match the required pattern ('+pattern+').');
}
}
}
}
无论我输入什么,该函数最终都会将该文本添加到错误错误中,即使我输入“hello”时不带引号,这应该与该正则表达式匹配...
抱歉冗长的解释,我对这个正则表达式匹配做错了什么?
【问题讨论】:
-
pattern不只是一个字符串吗?你不应该改用new RegExp(pattern)吗? -
@Bart,实际上没有,
String.match是宽容的:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… -
@SubkymeRick,你能在比赛前提醒
valstr的值吗? -
@Ray:但如果字符串是
"/^.../"而只是"^...",它将无法按预期工作。 -
@Ray:我很确定您可以将 RegExp 对象放入 jQuery 数据中,但我们不知道数据是如何初始化的,并且就 JavaScript 而言,正则表达式很好。通过将正则表达式和字符串转储到控制台,很容易混淆它们。
标签: php javascript jquery regex json