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