在explode()函数中使用正则表达式作为分隔符

10

我有一个字符串,想将其转换为数组,但是我想使用正则表达式来分隔每个单词。我使用下面的函数匹配整个单词。

function substr_count_array($haystack, $needle)
{
     $initial = 0;
     $bits = explode(' ', $haystack);

     foreach ($needle as $substring) 
     {
        if (!in_array($substring, $bits))
        {
            continue;
        }

        $initial += substr_count($haystack, $substring);
     }

     return $initial;
}

问题在于它会匹配例如 animal 的字符串,但不会匹配 animals。如果我进行部分匹配,如下所示:
function substr_count_array2($haystack, $needle)
{
     $initial = 0;

     foreach ($needle as $substring) 
     {
          $initial += substr_count($haystack, $substring);
     }

     return $initial;
}

它还匹配,比如说,a,因为它包含在单词animals中,并返回2。如何使用正则表达式作为分隔符来explode(),以便我可以匹配每个长度为5-7个字符的字符串?简单解释:
$animals = array('cat','dog','bird');
$toString = implode(' ', $animals);
$data = array('a');

echo substr_count_array($toString, $data);

如果我搜索一个字符,比如a,它会通过检查并验证为合法值,因为a包含在第一个元素中。但是,如果我匹配以空格分隔的整个单词,它会忽略它们,如果它们没有被空格分隔。因此,我需要用正则表达式分隔与要匹配的字符串之后的任何内容。

1个回答

15
简单来说,你需要使用preg_split而不是explodeexplode函数会根据固定的值进行分割,而preg_split函数会根据正则表达式进行分割。
在你的情况下,最好是根据非单词字符\W+进行分割,然后手动过滤结果的长度。

类似这样的东西? preg_split('(.+?)', $haystack); - Jessie Stalk
1
@JessieStalk - 不完全正确。你传递给 preg_split 的正则表达式是字符串被分割的模式,而不是你想要保留的字符串。如果你想要保留输入中的单词,你应该在非单词字符上进行分割:preg_split('/\W+/', $haystack) - Mr. Llama
感谢您的时间和努力 :) - Jessie Stalk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接