【问题标题】:regex in $_POST variable$_POST 变量中的正则表达式
【发布时间】:2017-01-15 14:40:29
【问题描述】:

我正在为 wordpress 开发一个插件 - woocommerce。我正在使用插件“Woocommerce 产品插件” - 使用此插件,我可以插入例如属性“颜色”的下拉选择列表,其中包含三种颜色 - 红色、黄色、黑色。这个插件现在在每个产品站点上,但每个产品上的表单名称都有不同的名称。这就是为什么我不知道如何用更少的代码获取数据的原因。

在一个产品网站上,我有这个名称的选择列表:

<select class="addon addon-select" name="addon-12822-variante-0">

在另一个产品网站上,我有相同的插件,但名称不同:

<select class="addon addon-select" name="addon-12834-variante-0">

您可以从这个示例中看到,名称中的数字在每个站点上都会发生变化。

我需要一个可以在所有产品网站上运行的代码,这就是为什么我想也许我可以在 $_POST['regex'] 中以某种方式插入正则表达式,但它是如何工作的? p>

我需要这个正则表达式“((addon)-((\d)+)-)(farbe)-(0|1|2|3)”。

最后我有类似的东西

$variant = $_POST['regexp'];

在每个产品网站上自动运行。

我希望有任何解决方法,并提前感谢每一个建议。

【问题讨论】:

  • 这符合您的要求吗? '/addon-[1-9]+-variante-[012]{1}/'。要检查,请遍历 post 值检查 preg_match 是否为真,然后执行您需要的任何其他操作
  • 嘿,不是正则表达式不起作用。我只是问如何在这个位置使用正则表达式?因为我刚刚找到了 php 函数“preg_match”,但我认为它不完全是我想要的,或者如果它是我不知道如何在 $_POST[''] 中使用它
  • 啊,对不起。好的,类似于 foreach:
  • 您可以在$_POSTarray_keys() 上使用preg_grep() 来查找所有字段名称。

标签: php regex wordpress post


【解决方案1】:

您可以使用preg_grep 从 $_POST 数组中提取您需要的元素:

$addonFields = array_flip(preg_grep('(your_pattern)', array_flip($_POST)));

编辑: 正如@CaTeR 所指出的,如果多次出现相同的值(或例如多个空值),上面的代码将不起作用。请参阅下面的其他答案,或使用类似的方法来获取您想要的字段:

$addonFields = array_intersect_key($_POST, array_flip(preg_grep('/pattern/', array_keys($_POST))));

【讨论】:

  • 谢谢,我想这就是我要找的。我会尝试并通知你。
  • 警告:如果一个值多次出现,最新的键将被用作它的值,所有其他的都将丢失。 PHP.net - array_flip()
【解决方案2】:

您可以使用array_keys 获得arraykeys,然后使用preg_grep 获得正确的keys。在下一行,您将获得一个索引数组,其中包含$_POST array 中包含的所有addons 字段。

注意:使用array_values,您将获得一个新的array 和新的有序keys,因此您可以获得您想要获得正确索引的值。

array_values(preg_grep('/^addon\-\d+\-variante-\d+$/', array_keys($_POST)));

这里有一个Ideone 示例,可以理解前面代码的功能。

现在,下一个函数为您从$_POST 变量中获取第一个addon 变量的值(假设您想在每个页面中获取一个addon 变量):

function getAddonValue($post){

    $reg = '/^addon\-\d+\-variante-\d+$/';

    return $post[array_values(preg_grep($reg, array_keys($post)))[0]];

}

这里有一个Ideone sn-p 和完整的例子。

【讨论】:

    【解决方案3】:

    如果您不知道邮寄会收到哪些数据并希望对数据运行正则表达式,您可以执行以下操作:

    <?php foreach($_POST as $sPostKey => $sPostVal){
        if(preg_match($pattern, $sPostVal)){
        //do something with match
        }
     } ?>
    

    假设 $pattern 是正则表达式。 $sPostKey 是键,$sPostVal 包含数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多