Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用正则表达式和php匹配多个整词_Php_Regex - Fatal编程技术网

用正则表达式和php匹配多个整词

用正则表达式和php匹配多个整词,php,regex,Php,Regex,我正在我们的定制产品管理系统中实现“标签”功能。每个产品都有一个逗号分隔的标签列表。我们有一个带有复选框的“标签搜索”。用户可以检查多个标记,它将使用ajax过滤所有选定的标记,因此所有标记都需要匹配在一起。例如 Tags: Tag1,Tag2,Tag3 #1-product-tags: Tag3,Tag10,Tag2 #2-product-tags: Tag1,Tag3,Tag10 #3-product-tags: Tag5,Tag1,Tag3 #4-product-tags: Tag8,T

我正在我们的定制产品管理系统中实现“标签”功能。每个产品都有一个逗号分隔的标签列表。我们有一个带有复选框的“标签搜索”。用户可以检查多个标记,它将使用ajax过滤所有选定的标记,因此所有标记都需要匹配在一起。例如

Tags: Tag1,Tag2,Tag3

#1-product-tags: Tag3,Tag10,Tag2
#2-product-tags: Tag1,Tag3,Tag10
#3-product-tags: Tag5,Tag1,Tag3
#4-product-tags: Tag8,Tag4,Tag20
#5-product-tags: Tag20,Tag100,Tag500
选中上述标签进行过滤时,我希望返回#1、#2、#3,因为给定的标签列在这些产品的“产品标签”列中

我目前正试图通过在用户检查标记时动态创建正则表达式来使用正则表达式。为了符合匹配条件,产品必须检查所有标签。我是这样生成的:

   <?php 
       //empty collection array to fill with product loop
       $collection = array();

       //dynamically generated regex
       $regex = "\b" . $tag1 . "|" . $tag2 . "|" . $tag3 . "\b/i";

       //loop through each product and throw matches to collection
       foreach($products as $product) {
         if(preg_match($regex,$product->tags)) {
            array_push($collection,$product);
         }
       }
    ?>


我这样做并没有得到预期的结果。我能得到预期结果的最好方法是什么。我对正则表达式不是很在行,但我正在学习

我假设标记作为逗号分隔的字符串存储在数组中。如果是这种情况,可以使用将它们拆分为单独的数组,然后在数组中循环,并使用查看是否有任何子数组具有所有
$search
数组中的值:

$search = ['Tag1', 'Tag2', 'Tag3'];

$taglist = array_map(function ($v) { return explode(',', $v); }, $tags);

foreach ($taglist as $sub) {
    if (count(array_intersect($sub, $search)) == count($search)) {
        $products[] = implode(',', $sub);
    }
}
这种方法不仅效率高,而且更灵活。如果您有多个条件要检查,这将不会是一个问题。如果你用正则表达式来做这件事,你将很难制作正则表达式,而且很可能它会比这个简单的拆分循环解决方案慢很多

对于问题中的标记,这将不返回任何内容-
$products
数组将为空


如果您仍然想使用正则表达式,我建议您使用一些类似正则表达式的正则表达式

Tag2(,.*)?$|Tag1(,.*)?$/i
见现场示例

对于新规范,您必须使用正向前瞻

(?=(((Tag1|Tag2|Tag3)(,.*)?$)))

P< >活生生的例子< /P> < P>我认为你的正则表达式有2个小细节需要考虑。 1-缺少第一个分隔符字符/ 2-将要选择其中一个选项的选项分组在括号中

$regex = "/\b(" . $tag1 . "|" . $tag2 . "|" . $tag3 . ")\b/i";


try with this code to see my result.
<?php
 $tag1 = 'Tag1';
 $tag2 = 'Tag2';
 $tag3 = 'Tag3';

$arr = array();
$arr["#1-product-tags"] = "Tag3,Tag10,Tag2";
$arr["#2-product-tags"] = "Tag1,Tag3,Tag10";
$arr["#3-product-tags"] = "Tag5,Tag1,Tag3";
$arr["#4-product-tags"] = "Tag8,Tag4,Tag20";
$arr["#5-product-tags"] = "Tag20,Tag100,Tag500";
var_dump($arr);

//empty collection array to fill with product loop
$collection = array();

//dynamically generated regex
$regex = "/\b(" . $tag1 . "|" . $tag2 . "|" . $tag3 . ")\b/i";
var_dump($regex);

//loop through each product and throw matches to collection
foreach($arr as $product) {
    //var_dump($product);
    if(preg_match($regex,$product)) {
        array_push($collection,$product);
    }
}
var_dump($collection);
?>
$regex=“/\b(“.$tag1.”|“$tag2.”|“$tag3.”)\b/i”;
尝试使用此代码查看我的结果。

我终于想出了一个有效的解决方案<代码>/^(?=.*Tag1)(?=.*Tag2)(?=.*Tag3)。*$/就像一个符咒一样工作

我假设产品标签/列在一个数组中?并且缺少正则表达式的开始分隔符。所有标记都是每个产品的列上的字符串。因此,每个产品都有一列“tags”,它们是逗号分隔的字符串。我不完全确定\b在正则表达式中是什么,但我认为表达式应该以分隔符开头(/在结尾使用,而不是开头)<代码>$regex=“/\b”$tag1。“\b/i”我不太确定,但从我读到的内容来看\b会围绕一个完整的单词,因此整个单词匹配,而不仅仅是单词的一部分。这不会给出预期的结果。您返回的是Tag3、Tag10、Tag2,但Tag1在需求中。从技术上讲,它不应该返回任何内容。我希望所有3个都是必需的。因此,如果标签是Tag1、Tag2、Tag3,它应该返回所有带有所有3个标签的产品。@DevNinjaJeremy:啊,那么我误解了你的问题。我以为你只想要任何标签。它可以很容易地修改。@DevNinjaJeremy:我已经更新了答案(和演示)。这对我来说仍然不起作用,但我确实使用了这个方法成功地得到了我想要的。当我搜索多个标签时,它失败了。我所做的不是使用数组_intersect,而是循环遍历每个数组并比较每个传递的标记。如果匹配的话,我就数一数。如果全部匹配,我收集了产品信息。@DevNinjaJeremy:对于哪些输入,此操作失败了吗?如果你不介意的话,你能在ideone.com上展示一个重现这个问题的演示吗?所以我修正了我的答案?这也不会给出预期的结果。它仍将匹配Tag1或Tag2。我需要Tag1和Tag2来匹配。但是在我看来,您只需要知道这个产品是否匹配任何标签,如果是,您是否将产品添加到列表中?或者你有什么事没有告诉我们;)我认为正则表达式不能满足OP的要求。只有当所有标记都出现在逗号分隔的字符串中时,它才应该匹配。