【问题标题】:perl regex pattern works in php but not in javascript?perl 正则表达式模式在 php 中有效,但在 javascript 中无效?
【发布时间】: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


【解决方案1】:

我猜你的正则表达式是这样的字符串:

"/^([A-Za-z0-9 .\-']*)$/"

这不能用作正则表达式。在将其插入 JavaScript 之前,请尝试删除前导和尾随斜杠。

打开你的 JavaScript 控制台,看看它有什么作用,看看一些斜线会产生什么影响:

var pat = "^([A-Za-z0-9 .\\-']*)$";
console.log('pancakes'.match(pat));
console.log('pancakes'.match(new RegExp(pat)));
console.log('pancakes'.match(/^([A-Za-z0-9 .\-']*)$/));

var pat2 = "/^([A-Za-z0-9 .\\-']*)$/";
console.log('pancakes'.match(pat2));
console.log('pancakes'.match(new RegExp(pat2)));

或者去这里:http://jsfiddle.net/ambiguous/7FPux/

【讨论】:

  • 看来问题是模式的字符串版本破坏了它。我必须从模式字符串中删除第一个 / 和最后一个 /,然后通过 new RegExp(); 运行它。它的输出按我想要的方式工作!谢谢大家的帮助!
  • @Ray:不如“字符串不等于自身”那么酷,但仍然是一个有趣的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多