在没有正则表达式的情况下检测文本中的一组单词的最有效方法

时间:2012-04-10 01:28:58

标签: php

不幸的是,由于一些奇怪的原因,正则表达式方法对我来说不适用于UTF-8(preg_replace + UTF-8 doesn't work on one server but works on another)。

在不使用正则表达式的情况下实现目标的最有效方法是什么?

尽可能清楚地表达以下一组词:
猫,狗,天空

猫会返回假的 天空是蓝色会回归真实的 天际将返回虚假

3 个答案:

答案 0 :(得分:1)

我最初的想法是在空格上爆炸文本,然后检查结果数组中是否存在单词。当然,你可能会有一些标点符号泄漏到你的阵列中,你也必须考虑。

另一个想法是检查单词的strpos。如果找到了,请测试下一个字符,看它是否是一个字母。如果是一封信,你知道你找到了一个单词的潜台词,并放弃了这个发现。

// Test online at http://writecodeonline.com/php/

$aWords = array( "I", "cat", "sky", "dog" );
$aFound = array();
$sSentence = "I have a cat. I don't have cats. I like the sky, but not skyrim.";

foreach ( $aWords as $word ) {
  $pos = strpos( $sSentence, $word );
  // If found, the position will be greater than or equal to 0
  if ( !($pos >= 0) ) continue;
    $nextChar = substr( $sSentence , ( $pos + strlen( $word ) ), 1 );
    // If found, ensure it is not a substring
    if ( ctype_alpha( $nextChar ) ) continue;
      $aFound[] = $word;
}

print_r( $aFound ); // Array ( [0] => I [1] => cat [2] => sky )

当然,更好的解决方案是确定无法使用正则表达式的原因,因为这些解决方案将无法像模式搜索那样高效。

答案 1 :(得分:1)

超短的例子,但这是我没有正则表达式的方式。

$haystack = "cats"; //"the sky is blue"; // "skyrim";
$needles = array("cat", "dog", "sky");

$found = false;
foreach($needles as $needle)
    if(strpos(" $haystack ", " $needle ") !== false) {
        $found = true;
        break;
    }


echo $found ? "A needle was found." : "A needle was not found.";

答案 2 :(得分:0)

如果你只是想找到一个单词在一个字符串中,你可以将字符串存储在一个变量中(如果打印字符串打印变量,而字符串在里面),并使用“in”。例如:

a = 'The sky is blue'
The in a
True