preg_match():未知修饰符' h'在PHP中

时间:2014-03-27 10:06:54

标签: php

尝试将单词数组与用户键入的文本匹配时会显示此错误..

     foreach($items as $k=>$item){
        if($item!='' && preg_match("/".$item."/", $opText)){
          if(!in_array($item,$params[$val['name']],true)){
             $params[$val['name']][]=$item;
          }
        }
     }

3 个答案:

答案 0 :(得分:3)

$item中有/,这意味着它认为正则表达式的结束时间早于它。

/goldfish/herring/
//        ^ Not actually a modifier (h) - just an unescaped string

您可以使用preg_quote($string, '/')功能将其转换为以下内容:

/goldfish\/herring/
//       ^ Escaped

<强>用法

 foreach($items as $k=>$item){
    if($item!='' && preg_match("/".preg_quote($item,"/")."/", $opText)){
      if(!in_array($item,$params[$val['name']],true)){
         $params[$val['name']][]=$item;
      }
    }
 }

提示

如果这是一个硬编码的正则表达式,您可以通过不必转义常用字符来更改转义字符以使正则表达式更容易阅读:

~goldfish/herring~
//       ^       ^
//       |       \- Using a different modifier
//       |       
//       \- Different from the modifier, so we don't have to escape it

答案 1 :(得分:2)

如果您有动态输入,最好使用preg_quote()确保此输入不违反任何正则表达式规则。

foreach($items as $k=>$item){
   if($item!='' && preg_match("/".preg_quote($item, '/')."/", $opText)){
     if(!in_array($item,$params[$val['name']],true)){
         $params[$val['name']][]=$item;
     }
   }
}

答案 2 :(得分:0)

您需要preg_quote()

preg_match("/".preg_quote($item)."/", $opText)