【问题标题】:preg_match(): Compilation failed: nothing to repeat at offset 2preg_match():编译失败:在偏移量 2 处没有可重复的内容
【发布时间】:2014-04-04 17:06:40
【问题描述】:

我不知道为什么我的正则表达式会被破坏。

我希望它匹配:

100,000 美元

100,000

100000(我知道它不匹配,但我想要它)

preg_match("/^\$?(?!0.00)\d{1,3}(,\d{3})*(\.\d\d)?$/", $string);

那么我怎样才能让它也匹配最后一个,为什么我会收到这个错误?这个正则表达式在我的 javascript 检查中运行良好。

谢谢

【问题讨论】:

    标签: php regex preg-match currency


    【解决方案1】:

    您需要转义反斜杠以使其成为文字,因为它会将美元符号转义为 PHP 字符串语法的一部分。

    preg_match("/^\\\$?(?!0.00)\d{1,3}(,\d{3})*(\.\d\d)?$/", $string);
    

    或者使用单引号而不是双引号:

    preg_match('/^\$?(?!0.00)\d{1,3}(,\d{3})*(\.\d\d)?$/', $string);
    

    要允许没有逗号的数字,您可以使用交替:

    preg_match('/^\$?(?!0.00)(\d{1,3}(,\d{3})*|\d+)(\.\d\d)?$/', $string);
    

    【讨论】:

      【解决方案2】:

      添加两个斜杠

      preg_match("/^\\\$?(?!0.00)\d{1,3}(,\d{3})*(\.\d\d)?$/", $string,$matches);
                     ^^
      

      代码

      <?php
      $string='$100,000';
      preg_match("/^\\\$?(?!0.00)\d{1,3}(,\d{3})*(\.\d\d)?$/", $string,$matches);
      print_r($matches);
      

      OUTPUT :

      Array
      (
          [0] => $100,000
          [1] => ,000
      )
      

      更新:如果你想匹配11000等数字然后使用下面的一个,注意变化:

      preg_match("/^\\\$?(?!0.00)\d{1,3}(\,?\d{3})*(\.\d\d)?$/", $string,$matches);
                                           ^ here making the comma optional
      

      【讨论】:

      • 谢谢,但现在它说:“未定义的偏移量:0”
      • 为什么会出现错误?为什么添加转义斜线有效?
      • 你能发布你的字符串吗?
      • @ShankarDamodaran 我想两个\` will be fine. But still you guys know better php` 然后是我。
      • @SabujHassan,我不擅长正则表达式 :) 只是在学习。请随时编辑我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2020-02-18
      • 1970-01-01
      • 2020-01-28
      相关资源
      最近更新 更多