2013-07-29 60 views
0

我正在构建一个小型应用程序,它有一个字符串输入。如果数组中的任何完整值与输入字符串部分匹配,我也会有一组单词。例如:PHP中部分字符串匹配字符串

Array('London Airport', 'Mancunian fields', 'Disneyland Florida') 

如果用户输入“佛罗里达州迪斯尼乐园在美国”或只是“迪斯尼乐园,美国佛罗里达州”我要返回匹配。

任何帮助将不胜感激。提前致谢。

+1

你已经试过了什么? – BenM

+0

我已经尝试了in_array,它只返回真正的全字符匹配 – aniga

回答

1

数据来搜索:

<?php 
$data = array(
    0 => 'London Airport', 
    1 => 'Mancunian fields', 
    2 => 'Disneyland Florida' 
); 

查找满弦

搜索功能:

<?php 
/** 
* @param array $data 
* @param string $what 
* @return bool|string 
*/ 
function searchIn($data, $what) { 
    foreach ($data as $row) { 
     if (strstr($what, $row)) { 
      return $row; 
     } 
    } 

    return false; 
} 

结果:

<?php 
// Disney Florida 
echo searchIn($data, 'Disneyland Florida in USA'); 

// Disney Florida 
echo searchIn($data, 'Disneyland Florida, USA'); 

// false 
echo searchIn($data, 'whatever Florida Disneyland'); 
echo searchIn($data, 'No match'); 
echo searchIn($data, 'London'); 

查找字

的任何组合在搜索功能:

<?php 
/** 
* @param array $data 
* @param string $what 
* @return int 
*/ 
function searchIn($data, $what) { 
    $needles = explode(' ', preg_replace('/[^A-Za-z0-9 ]/', '', $what)); 

    foreach ($data as $row) { 
     $result = false; 

     foreach ($needles as $needle) { 
      $stack = explode(' ', $row); 

      if (!in_array($needle, $stack)) { 
       continue; 
      } 

      $result = $row; 
     } 

     if ($result !== false) { 
      return $result; 
     } 
    } 

    return false; 
} 

结果:

<?php 
// Disneyland Florida 
echo searchIn($data, 'Disneyland Florida in USA'); 

// Disneyland Florida 
echo searchIn($data, 'Disneyland Florida, USA'); 

// Disneyland Florida 
echo searchIn($data, 'whatever Florida Disneyland'); 

// false 
echo searchIn($data, 'No match'); 

// London Airport 
echo searchIn($data, 'London'); 

正如你所看到的,用户搜索的顺序以及该字符串是否以Disneyland开头并不重要。

+0

感谢您的时间和解决方案。您的解决方案匹配任何关键字,我想要的只是阵列中的完全匹配。即如果用户输入“佛罗里达州迪士尼乐园”或“美国佛罗里达州迪士尼乐园”这两种情况都会返回true,但如果用户输入“USA Disneyland NOT Florida”或“Florida Disneyland”这两种情况都会返回错误。 – aniga

+0

所以,我用大炮杀死了一只苍蝇;)应该返回错误的输入:“佛罗里达迪士尼乐园”,“佛罗里达州迪士尼乐园”,“迪斯尼乐园佛罗里达东西”,“迪士尼乐园”。对? – TheFrost

+0

正确。只有当数组数据上的完整字符串与用户输入的部分或全部字符串匹配时才返回true。再次感谢你的时间。 – aniga

0
function isInExpectedPlace($inputPlace) { 
    $places = array('London Airport', 'Mancunian fields', 'Disneyland Florida'); 
    foreach($places as $place) { 
     if(strpos($inputPlace, $place) !== false) 
      return true; 
     } 
    } 
    return false; 
} 
0

PHP 5.3+为使用匿名函数:

<?php 

$places = array('London Airport', 'Mancunian fields', 'Disneyland Florida'); 
$search = 'Disneyland Florida in USA'; 

$matches = array_filter($places, function ($place) use ($search) { 
    return stripos($search, $place) !== false; 
}); 

var_dump($matches);