在PHP中从多个类别数组中搜索子字符串

时间:2011-12-06 01:38:10

标签: php regex arrays string loops

我有一段文字,长约1500字。我必须在本文中搜索某些单词的出现次数,并按类别对它们进行分组。例如,如果找到以下任何一个单词:“dalmation”,“boxer”,“terrier”,则回显“犬齿”,如果发现“狮子”,“豹子”,“cheeta”,则回显“猫科动物” “ 等等等等。在其他词中找到的词也是可以接受的,例如“foxterrier”。

我目前正在使用以下内容来浏览字符串:

$arrTitle = explode(" ", "Loren ipsum dolor ...............");
// For dogs:
foreach( $arrTitle as $key => $value){
    echo "Name: $key, Value: $value <br />";
    $words = array("dalmation", "boxer", "terrier");
    foreach($words as $word){
        if (stripos($value, $word) !== false) {
            echo "Canines Exists";
        }
    }
}

//For cats:
foreach( $arrTitle as $key => $value){
    echo "Name: $key, Value: $value <br />";
    $words = array("lion", "leopard", "cheeta");
    foreach($words as $word){
        if (stripos($value, $word) !== false) {
            echo "Felines Exists";
        }
    }
}

// ...Repeat the above for all categories.

处理需要很长时间,而且我不确定它是最有效的做事方式。请任何人帮我找到更快的方法吗?非常感谢你的帮助。

3 个答案:

答案 0 :(得分:3)

你在我的地区!

到目前为止,最快的方法是array_flip,然后使用isset检查单词是否存在,花了我很长时间来计算出那个单词。这几乎可以保持数百万字(在字符串或数组中搜索永远不会与速度相匹配),但在这种情况下可能会占用RAM。

您应首先确定$words

$arrTitle = strtolower($arrTitle);
$arrTitle = explode(' ', $arrTitle);

$words=array('dalmation', 'boxer', 'terrier');
$words=array_flip($words);

foreach($arrTitle as $key => $value)
    {
    echo "Name: $key, Value: $value <br />";
    if (isset($words[$value])) echo $value.' Exists <br/>';
    }

答案 1 :(得分:2)

您可以编写类似单词的正则表达式,然后对每个单词进行单个搜索。 Regexps并不是非常快,但它们比在PHP中运行自己的循环更快。 : - )

$groups = array(
  'Canines' => array("dalmation", "boxer", "terrier"),
  'Felines' => array("lion", "leopard", "cheeta")
);

foreach ($groups as $group => $members) {
  $pattern = "/" . implode("|", $members) . "/i";
  if (preg_match($pattern, $src)) {
    print $group;
  }
}

元代码。我没有测试过这个。

这里的想法是从代码中删除实际的组。毕竟,您的数据可以从数据库或其他来源加载;数据结构和数据应该是分开的。

通过使用上面的数组,您可以添加新组而无需更改比较代码的内容。即“鱼”成为一个群体,而不是一大堆代码。

答案 2 :(得分:1)

作为当前脚本的优化,您应该检查同一循环中的所有单词,而不是多次在$ arrTitle上运行foreach。或者作为替代方案,只需在每个单词的整个文档上使用stripos。

如果这是针对实际的生产站点并且需要反复运行,我根本不会在PHP中执行此操作。对文档具有适当索引的数据库(MySQL或Solr)可以产生更快的结果。