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

Php 在没有正则表达式的情况下检测文本中的一组单词的最有效方法,php,Php,不幸的是,由于某种奇怪的原因,regex方法不适合我使用UTF-8() 如果不使用正则表达式,实现我的目标最有效的方法是什么 为了尽可能清楚地说明,对于以下一组单词: 猫、狗、天空 猫会返回false 天空是蓝色的,它将回归真实 skyrim将返回false我最初的想法是将文本分解为空格,然后检查结果数组中是否存在您的单词。当然,你可能会有一些标点符号泄漏到你的数组中,你也必须考虑。 另一个想法是检查单词的strpos。如果找到了,测试下一个字符是否为字母。如果它是一个字母,你知道你已经找到了一

不幸的是,由于某种奇怪的原因,regex方法不适合我使用UTF-8()

如果不使用正则表达式,实现我的目标最有效的方法是什么

为了尽可能清楚地说明,对于以下一组单词:
猫、狗、天空

猫会返回false
天空是蓝色的,它将回归真实

skyrim将返回false

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

另一个想法是检查单词的
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 )

当然,更好的解决方案是确定为什么不能使用regex,因为这些解决方案远没有模式搜索那么有效。

超级简短的示例,但这是我在没有regex的情况下所采用的方法

$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.";

如果您只是尝试查找某个单词是否在字符串中,则可以将该字符串存储在变量中(如果打印字符串,则将该变量打印在字符串中),然后使用“in”。例如:

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

问题是——这真的是处理非常大的文本时最有效的方法吗?@Lior最有效的方法是找出如何让正则表达式工作。这远没有那么有效。我只是一辈子都搞不懂。。。老实说,我不知道为什么它不起作用,也不能再等了,不幸的是,我必须使用另一种解决方案。你有没有打电话给我?;-)我还认为,在这个解决方案中,
strpos
的性能会更好,因为只有当
$heystack
包含
$needle
时,才对Lior感兴趣,而不是出现的次数。看看你使用的是什么版本的PHP?