Regular expression as delimiter in explode()

Jessie Stalk picture Jessie Stalk · Jul 18, 2014 · Viewed 8.4k times · Source

So I have a string which I'm turning into an array but I want to separate each word using a regex. I'm matching a whole word using the below function.

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;
}

The problem is that it matches the string animal for example but not animals. And if I do a partial match like this:

function substr_count_array2($haystack, $needle)
{
     $initial = 0;

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

     return $initial;
}

It also matches, let's say, a since it's contained withing the word animals and returns 2. How do I explode() using a regular expression as a delimiter so that I may, for example, match every string that has a length of 5-7 characters?

Explained simpler:

$animals = array('cat','dog','bird');
$toString = implode(' ', $animals);
$data = array('a');

echo substr_count_array($toString, $data);

If I search for a character such as a, it gets through the check and validates as a legit value because a is contained within the first element. But if I match whole words exploded by a space, it omits them if they are not separated by a space. Thus, I need to separate with a regular expression that matches anything AFTER the string that is to be matched.

Answer

Mr. Llama picture Mr. Llama · Jul 18, 2014

Simply put, you need to use preg_split instead of explode.

While explode will split on constant values, preg_split will split based on a regular expression.

In your case, it would probably be best to split on non-word characters \W+, then manually filter the results for length.