PHP正则表达式与JavaScript正则表达式的区别

8

您好,我希望在Spry JavaScript框架中使用以下PHP正则表达式,但它们在Spry框架中无法工作,而且Spry不允许用户输入!
1)"/^[\d]+$/"
2)"/^([\x{600}-\x{6FF}]+\s)*[\x{600}-\x{6FF}]+$/u"
3)"/^([\x{600}-\x{6FF}]+\d*\s)*[\x{600}-\x{6FF}]+\d*$/u"
请帮助我将它们转换为可以在Spry框架中使用的格式。


JavaScript 正则表达式 - georg
你目前有什么进展了吗? - Felix Kling
2个回答

8
1) /^[\d]+$/
2) /^([\u0600-\u06FF]+\s)*[\u0600-\u06FF]+$/
3) /^([\u0600-\u06FF]+\d*\s)*[\u0600-\u06FF]+\d*$/

/u不被支持,因为Javascript正则表达式只支持unicode的码点。在Javascript正则表达式中,应该使用\x{???}(unicode码点)来代替\u????(始终为4个数字0填充)。

在这些情况下,其余正则表达式遵循以下规则:

  • Javascript中的\s被视为unicode
  • \d则不是,这意味着只接受ASCII数字(0-9)。

这意味着我们需要特别允许“外来”数字,例如波斯文(码点06F0-06F9):

1) /^[\d\u06F0-\u06F9]+$/
2) /^([\u0600-\u06FF]+\s)*[\u0600-\u06FF]+$/
3) /^([\u0600-\u06FF]+[\d\u06F0-\u06F9]*\s)*[\u0600-\u06FF]+[\d\u06F0-\u06F9]*$/

(如果不允许接受ASCII数字,请删除\d)

不确定示例1中的括号应该怎么用,原始写法如下:

1) /^\d+$/

为了添加波斯数字,我们需要它们,请参见上文。

更新

然而,Spry字符掩码只希望在每个输入字符上应用正则表达式 - 也就是说,我们实际上不能进行模式匹配,它只是一个“列表”,其中包含所有地方接受的字符,这种情况:

1      ) /[\u06F0-\u06F9\d]/      // match 0-9 and Persian numerals
2 and 3) /[\u0600-\u06FF\d\s]/    // match all Persian characters (includes numerals), 0-9 and space

如果您不希望接受0-9,请再次删除\d。

更新2

现在...使用正则表达式进行Spry验证:

var checkFullName = function(value, options)
{
   // Match with the by now well-known regex:
   if (value.match(/^([\u0600-\u06FF]+\s)*[\u0600-\u06FF]+$/))
   {
      return true;
   }
   return false;
}

var sprytextfield =
     new Spry.Widget.ValidationTextField(
          "sprytextfield", 
          "custom", 
          { validation: checkFullName, validateOn: ["blur", "change"] }
     );

可以针对第三种情况创建类似的自定义函数。
请参见Adobe labs的示例: (点击链接)

第三个有一个错别字,但第二个应该可以工作,除非有一种特殊的波斯空格字符,JavaScript和我都不知道。基本上它是一个“由单个空格分隔的单词”的正则表达式。我会更深入地研究空格字符。 - JimmiTh
之后,当我想使用空格字符时,我键入一个波斯字符,但我无法键入空格,并且我将键盘布局更改为英语,但我仍然无法键入空格!在第二个和第三个正则表达式中。 - fire boy
或许是因为我错过了在 Spry 中将其用作字符掩码的部分。据我所知,字符掩码不允许在不同的位置接受不同的字符,它基本上只是一个表示为正则表达式的接受字符列表。请参见编辑后的答案。 - JimmiTh
好的,感谢您的帮助,但是在上面的正则表达式中,我想要使用波斯语字符来结束正则表达式,而不是空格,因为当用户在服务器端php代码中输入完整名称末尾的空格时,php正则表达式会返回错误! 但是spry能够接受这种情况! - fire boy
谢谢,我使用这个正则表达式 /[\u0600-\u06FF\s?]/ 但是它不起作用并且接受更多的空格字符! - fire boy
显示剩余5条评论

2

您是将它们作为字符串传递还是正则表达式对象传递?尝试从正则表达式周围删除“字符”。

“u”标志有些棘手。您可能需要解释第二个和第三个正则表达式尝试做什么。


这是 Spry 框架中我的正则表达式之一。var sprytextfield1 = new Spry.Widget.ValidationTextField("spryAddress", "none", {validateOn:["blur"], maxChars:80, characterMasking:/^([\u0600-\u06FF]+\s)*[\u0600-\u06FF]+$/, useCharacterMasking:true}); - fire boy
嗯,好的,这些字符是什么意思?你确定转换是从 \x600 到 \u0600 吗? - david
/([\u0600-\u06FF])/ 是波斯语的 Unicode 正则表达式,我可以在 Spry 框架中使用它,但是我无法在 Spry 框架中使用上述正则表达式。我不知道它有什么问题! - fire boy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接