Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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
当给定的reqular表达式在匹配单词之间有空格时,php preg_grep不起作用_Php_Regex - Fatal编程技术网

当给定的reqular表达式在匹配单词之间有空格时,php preg_grep不起作用

当给定的reqular表达式在匹配单词之间有空格时,php preg_grep不起作用,php,regex,Php,Regex,我正在尝试使用preg\u grep $tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building"); $subBlockTag = "Boat"; $tag = preg_grep('/' . $subBlockTag . '[.]*/i', $tagOptArray); var_dump($tag); 这将输出以下结

我正在尝试使用
preg\u grep

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building");
$subBlockTag = "Boat";

$tag = preg_grep('/' . $subBlockTag . '[.]*/i', $tagOptArray);

var_dump($tag);
这将输出以下结果

array(1) { [6]=> string(22) "Boat and Ship Building" }
但是当
$subBlockTag=“造船”这将返回一个空数组,该数组不应为空,因为它应与标记数组中的“Boat and Ship Building”匹配

编辑

以下是可以为
$subBlockTag

$subBlockTag = "Boat Building";
$subBlockTag = "Ornamental Fish";
$subBlockTag = "Fish";
$subBlockTag = "Fruits and Vegetables";
$subBlockTag = "Diamond and Jewellery";

如果您在
$tagOptArray
中有规则的单词用空格分隔,并且您需要匹配包含相同顺序的单词的项目,您可以使用
*
替换所有空格,并使用您的方法:

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building");
$subBlockTag = "Boat Building";
$tag = preg_grep('/' .  preg_replace("~\s+~", ".*", trim($subBlockTag)) . '/is', $tagOptArray);
print_r($tag);

我建议也使用
trim($subBlockTag)
来避免在领先/落后位置出现
*
,尤其是在领先位置,以避免性能问题。如果要处理很长的文本,这可能会很慢

要在字符串中存在所有空格分隔的单词时查找匹配项,需要构造一个正则表达式,并在开头锚定正lookaheads:

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building");
$subBlockTag = "building boat";
$tag = preg_grep('/^(?=.*' .  implode(")(?=.*", preg_split("~\s+~", trim($subBlockTag))) . ')/is', $tagOptArray);
print_r($tag);

请参阅,这里是一个。

如果在
$tagOptArray
中有规则的单词用空格分隔,并且需要匹配包含相同顺序单词的项目,则可以使用
*
替换所有空格,并使用您的方法:

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building");
$subBlockTag = "Boat Building";
$tag = preg_grep('/' .  preg_replace("~\s+~", ".*", trim($subBlockTag)) . '/is', $tagOptArray);
print_r($tag);

我建议也使用
trim($subBlockTag)
来避免在领先/落后位置出现
*
,尤其是在领先位置,以避免性能问题。如果要处理很长的文本,这可能会很慢

要在字符串中存在所有空格分隔的单词时查找匹配项,需要构造一个正则表达式,并在开头锚定正lookaheads:

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building");
$subBlockTag = "building boat";
$tag = preg_grep('/^(?=.*' .  implode(")(?=.*", preg_split("~\s+~", trim($subBlockTag))) . ')/is', $tagOptArray);
print_r($tag);

请参阅,这里有一个。

用正则表达式或字符
|

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building","boat");
$subBlockTag = "Building   Boat";
$tag = preg_grep('/' . preg_replace("~\s+~", "|",$subBlockTag) . '/is', $tagOptArray);
print_r($tag);
输出:

Array
(
    [6] => Boat and Ship Building
    [7] => boat
)

用正则表达式或字符
|

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building","boat");
$subBlockTag = "Building   Boat";
$tag = preg_grep('/' . preg_replace("~\s+~", "|",$subBlockTag) . '/is', $tagOptArray);
print_r($tag);
输出:

Array
(
    [6] => Boat and Ship Building
    [7] => boat
)

您的意思是允许单词之间有空格分隔的字符(或任何非单词字符)?请澄清。为什么会匹配,您要求的是
造船
,后面是任何东西<代码>造船和造船显然不匹配刚才我注意到了!我需要知道正确的正则表达式。当
$subBlockTag
是“Boat”或“Boat Building”时,它应该与标记“Boat and Ship Building”相匹配:
Building Boat
?我不是说不区分大小写,而是说单词的顺序。另外,如果
$tagOptArray
中只有“boat”,那么
boat building
building boat
的结果必须是什么?您的意思是允许单词之间有空格分隔的字符(或任何非单词字符)?请澄清。为什么会匹配,您要求的是
造船
,后面是任何东西<代码>造船和造船显然不匹配刚才我注意到了!我需要知道正确的正则表达式。当
$subBlockTag
是“Boat”或“Boat Building”时,它应该与标记“Boat and Ship Building”相匹配:
Building Boat
?我不是说不区分大小写,而是说单词的顺序。此外,如果
$tagOptArray
中单独存在“boat”,那么
造船
造船
的结果必须是什么?如果
$subBlockTag
造船
,那么这也应该匹配。另外,如果
$tagOptArray
中有
船,而不是“船和造船”,那么这也应该匹配。我们能给出一个解决方案吗?如果
$subBlockTag
造船
,那么这也应该匹配。另外,如果
$tagOptArray
中有
船,而不是“船和造船”,那么这也应该匹配。我们能给出一个解决方案吗?您的回答解决了
$tagOptArray
中只有“船”的问题。但当
$subBlockTag=“水果和蔬菜”时,它也会匹配请检查我的edit@user27:因为它与
匹配。你不想要吗?如何确定从搜索中保留哪个词和删除哪个词?您的答案解决了
$tagOptArray
中只有“boat”时的问题。但当
$subBlockTag=“水果和蔬菜”时,它也会匹配请检查我的edit@user27:因为它与
匹配。你不想要吗?如何确定要保留的单词和要从搜索中删除的单词?