【问题标题】:Use arrays in preg_match()在 preg_match() 中使用数组
【发布时间】:2016-12-05 08:27:51
【问题描述】:

我知道您可以将数组与 preg_replace 一起使用,但我需要匹配 2 个数组。 1 个数组带有禁止字符,另一个带有我希望它找到的变量。 基本上:

$invalidChars = array("#/#", "#\\#", "#'#", "#\"#");
$matchIn = array("var1" => $var1 , "var2" => $var2);

如果我执行以下操作来匹配它们:

if(preg_match($invalidChars, $matchIn)){
   echo "Invalid chars found";
   die();
}else{
   "No invalid chars";
   die();
}

然后 PHP 向我抛出以下错误

 Warning: preg_match() expects parameter 2 to be string, array given

如果无法将 preg_match 与 2 个数组一起使用,我将如何检查变量是否包含一个或多个无效字符?

【问题讨论】:

标签: php arrays pcre


【解决方案1】:

我做了类似的事情。这是我用来解决问题的代码的细微变化:

public function remove_value_from_array($val, &$arr) {
   array_splice($arr, array_search($val, $arr), 1);
}

public function filter($invalidChars, $matchIn){
   $values = array_values($matchIn);
   /*Then you build the regular expression you will need for filtering.*/
   /*With $invalidChars = array("#/#", "#\\#", "#'#", "#\"#"), you will get "#/#|#\\#|#'#|#\#"*/
   $regex = implode("|", $invalidChars);
   $filtered_values = array_filter($values, function($value) use ($regex){
      preg_match ('/'.$regex.'/i', $value, $matches); return count($matches) > 0;
   });

   foreach($filtered_values as $value){
      remove_value_from_array($value, $matchIn);
   }

   return $matchIn;


}

但您需要转义 $invalidChars 数组值,因为它们包含特殊字符(#、...)。

【讨论】:

    【解决方案2】:

    preg_match() 只能接受字符串作为模式。它没有理由支持数组,因为可以使单个正则表达式模式匹配所有这些字符。

    $invalidChars = "#[/\\\\'\"]#";
    

    第二个参数也只能是字符串。在这种特定情况下,您可以只连接字符串来测试它们,因为您正在寻找单个字符:

    if (preg_match("#[/\\\\'\"]#", implode('', $matchIn))
    {
        ...
    

    但通常您必须遍历主题并单独测试它们:

    foreach ($matchIn as $subject)
        if (preg_match("#[/\\\\'\"]#", $subject))
        {
            ...
    

    【讨论】:

    • 哦,是的,很明显。谢谢,但是带有我所有变量的第二个数组呢?我是否必须单独 preg_match 每个变量
    • “但通常你必须遍历主题......”:你可以使用preg_grepphp.net/manual/en/function.preg-grep.php
    • 要在模式字符串中计算文字反斜杠,您需要 4 个反斜杠。如果下一个字符不是转义序列的第二部分,则只能使用 3 个反斜杠 (可以写 \\\',但不能写 \\\n
    • @CasimiretHippolyte 代表\ 实际上是两次强烈反对,但无论如何我认为你是对的。为了匹配\ ,必须在模式中提供\\ ,因此\\\\ ,因为我还必须为PHP解析器转义它。
    【解决方案3】:

    试试这个功能,

    function validate($invalidChars,$matchIn){
        foreach($invalidChars as $invalidChar){
            if(preg_match($invalidChar, $matchIn)){
                echo "Invalid chars found";
                return;
            }
        }
            echo "No invalid chars";
            return;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 2023-03-24
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      相关资源
      最近更新 更多