不幸的是,由于某些奇怪的原因,正则表达式方法不适用于 UTF-8 (preg_replace + UTF-8 在一台服务器上不起作用,但在另一台服务器上起作用)。
在不使用正则表达式的情况下实现我的目标的最有效方法是什么?
只是为了尽可能清楚,对于以下一组词:
猫,狗,天空
猫会返回假
天空是蓝色会返回真
天际会返回假
不幸的是,由于某些奇怪的原因,正则表达式方法不适用于 UTF-8 (preg_replace + UTF-8 在一台服务器上不起作用,但在另一台服务器上起作用)。
在不使用正则表达式的情况下实现我的目标的最有效方法是什么?
只是为了尽可能清楚,对于以下一组词:
猫,狗,天空
猫会返回假
天空是蓝色会返回真
天际会返回假
我最初的想法是在空格上爆炸文本,然后检查结果数组中是否存在您的单词。当然,您可能有一些标点符号泄漏到您的数组中,您也必须考虑这些。
另一个想法是检查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 )
当然,更好的解决方案是确定为什么不能使用正则表达式,因为这些解决方案远没有模式搜索那么有效。
超级简短的例子,但这是我没有正则表达式的方式。
$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