2014-07-18 30 views
3

所以我有一个字符串,我正在变成一个数组,但我想用正则表达式分隔每个单词。我使用下面的函数匹配整个单词。正则表达式作为分隔符爆炸()

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因为它包含withing字animals并返回2explode()如何使用正则表达式作为分隔符,例如,我可以匹配每个长度为5-7个字符的字符串?

解释简单:

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

echo substr_count_array($toString, $data); 

如果我寻找诸如a一个字符,它就会通过检查和验证的,因为a包含在第一元素中的一个合法的值。但是如果我匹配整个空间爆炸的单词,如果它们没有被空格隔开,它就会省略它们。因此,我需要用一个正则表达式来分隔,该正则表达式匹配任何要匹配的字符串AFTER

回答

6

简而言之,您需要使用preg_split而不是explode

虽然explode将在常数值上拆分,但preg_split将根据正则表达式进行拆分。

就你而言,最好是分割非单词字符\W+,然后手动过滤结果的长度。

+0

像这样的东西? 'preg_split('(。+?)',$ haystack);' –

+1

@JessieStalk - 不完全。您传递给'preg_split'的正则表达式是字符串* split * on的模式,而不是您想要*保留*的字符串。如果你试图在输入中保留单词,你应该分割非单词字符:'preg_split('/ \ W + /',$ haystack)' –

+0

感谢您的时间和精力:) –