【问题标题】:PHP Regex "Unknown modifier p" [duplicate]PHP正则表达式“未知修饰符p”[重复]
【发布时间】:2013-06-27 23:54:21
【问题描述】:

正则表达式 PHP 代码

// If url matches regex
            $regex = "/^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ /-]+.[A-z]{2,4}$/";
        if (preg_match($regex, $this->value)) {

            $this->valid();
        }

错误信息

Warning: preg_match() [<a href='function.preg-match'>function.preg-match</a>]: Unknown modifier 'p' in C:\Apache\www\profiletwist\lib\php\form\url.php on line 41
Call Stack
#   Time    Memory  Function    Location
1   0.0079  440016  {main}( )   ..\new.php:0
2   0.0964  667832  form->validate( )   ..\new.php:60
3   0.0968  668248  form_URL->validateUploadURL( )  ..\form.php:372
4   0.0969  668400  preg_match ( )  ..\url.php:41
Variables in local scope (#3)

$regex =



string '/^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ /-]+.[A-z]{2,4}$/' (length=79)

问题

如何修复正则表达式以使此“未知修饰符”错误不发生?

最后,我想要一个确保文本输入匹配的正则表达式:

"/upload/temporary/####_##_##_[A-z0-9 _-]+ "." [a-z]{3}

这是一个文件名目标。开头不变,最后一部分可以是随机散列,后跟任意扩展。在正则表达式之后进行进一步处理,但这是第一次测试。

谢谢!

【问题讨论】:

  • 可能还有+100 duplicates。基本上你要么使用其他分隔符,要么(最佳实践)使用preg_quote()
  • @HamZa 当您真正想要编写正则表达式(而不仅仅是匹配一大堆文字)时,最佳实践是什么?我想说选择其他分隔符是这里的最佳做法。
  • @ProfileTwist,因为没有人在他们的回答中包含它,这里是官方的reference on delimiters in PHP
  • @m.buettner 即使你不确定输入是什么?
  • @HamZa /upload/temporary/ 部分不是从某个未知来源提供的,而是在这种情况下是文字字符串。编写代码的人可以完全控制此处正则表达式的内容。因此,不同的分隔符。如果我从字符串变量中获取正则表达式的一部分并且我不能确定该字符串中没有元字符,我只会使用preg_quote

标签: php regex compiler-errors


【解决方案1】:
$regex = "~^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[\w./-]+\.[a-z]{2,4}$~";

将分隔符更改为~

当您使用分隔符(例如 /)时,您必须转义模式中的所有 /,否则正则表达式引擎认为这是模式的结尾。

由于u 是修饰符而p 不是修饰符,因此由于子字符串/^(/up.... 而出现此错误

【讨论】:

    【解决方案2】:

    您需要转义 前斜杠 或只使用另一个分隔符(在这种情况下我使用了!):

    $regex = "!^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ /-]+.[A-z]{2,4}$!"
    

    【讨论】:

      【解决方案3】:

      在正则表达式字符串中,您必须转义分隔符。或者更好:使用一个没有出现在正则表达式中的字符作为分隔符:

      其他分隔符(推荐

      $regex = "#^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ /-]+.[A-z]{2,4}$#";
      

      转义分隔符

      $regex = "/^(\/upload\/temporary\/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ \/-]+.[A-z]{2,4}$/";
      

      【讨论】:

      • 感谢您的精彩解释。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多