考虑:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
假设我有上述代码,正确的写法是什么样的语句if ($a contains 'are')
?
考虑:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
假设我有上述代码,正确的写法是什么样的语句if ($a contains 'are')
?
if (preg_match('/(are)/', $a)) {
echo 'true';
}
我有点惊讶,这里使用了 strpos
、strstr
和类似函数的答案都没有提到 多字节字符串函数(2015-05-08)。
基本上,如果你在查找具有某些语言特定字符(如德语、法语、葡萄牙语、西班牙语等)的单词时遇到困难(例如:ä、é、ô、ç、º、ñ),你可能需要在函数前加上 mb_
。因此,接受的答案将使用 mb_strpos
或 mb_stripos
(用于不区分大小写的匹配):
if (mb_strpos($a,'are') !== false) {
echo 'true';
}
mb_
函数。在PHP中,验证字符串是否包含某个子串的最佳方法是使用一个简单的帮助函数,如下所示:
function contains($haystack, $needle, $caseSensitive = false) {
return $caseSensitive ?
(strpos($haystack, $needle) === FALSE ? FALSE : TRUE):
(stripos($haystack, $needle) === FALSE ? FALSE : TRUE);
}
strpos
查找字符串中第一次出现的区分大小写的子字符串的位置。stripos
查找字符串中第一次出现的不区分大小写的子字符串的位置。myFunction($haystack, $needle) === FALSE ? FALSE : TRUE
确保 myFunction
始终返回布尔值,并修复了当子字符串的索引为0时出现的意外行为。$caseSensitive ? A : B
根据 $caseSensitive
的值选择使用 strpos
或 stripos
进行操作。var_dump(contains('bare','are')); // Outputs: bool(true)
var_dump(contains('stare', 'are')); // Outputs: bool(true)
var_dump(contains('stare', 'Are')); // Outputs: bool(true)
var_dump(contains('stare', 'Are', true)); // Outputs: bool(false)
var_dump(contains('hair', 'are')); // Outputs: bool(false)
var_dump(contains('aren\'t', 'are')); // Outputs: bool(true)
var_dump(contains('Aren\'t', 'are')); // Outputs: bool(true)
var_dump(contains('Aren\'t', 'are', true)); // Outputs: bool(false)
var_dump(contains('aren\'t', 'Are')); // Outputs: bool(true)
var_dump(contains('aren\'t', 'Are', true)); // Outputs: bool(false)
var_dump(contains('broad', 'are')); // Outputs: bool(false)
var_dump(contains('border', 'are')); // Outputs: bool(false)
您可以使用strstr
函数:
$haystack = "I know programming";
$needle = "know";
$flag = strstr($haystack, $needle);
if ($flag){
echo "true";
}
不使用内置函数:
$haystack = "hello world";
$needle = "llo";
$i = $j = 0;
while (isset($needle[$i])) {
while (isset($haystack[$j]) && ($needle[$i] != $haystack[$j])) {
$j++;
$i = 0;
}
if (!isset($haystack[$j])) {
break;
}
$i++;
$j++;
}
if (!isset($needle[$i])) {
echo "YES";
}
else{
echo "NO ";
}
许多使用substr_count
的答案会检查结果是否>0
。但是由于if
语句将零视为false的同义词,因此您可以避免该检查并直接编写:
if (substr_count($a, 'are')) {
要检查是否不出现,请添加!
运算符:
为了检查是否未出现,请添加!运算符:
if (!substr_count($a, 'are')) {
<?php
if (!function_exists('is_str_contain')) {
function is_str_contain($string, $keyword)
{
if (empty($string) || empty($keyword)) return false;
$keyword_first_char = $keyword[0];
$keyword_length = strlen($keyword);
$string_length = strlen($string);
// case 1
if ($string_length < $keyword_length) return false;
// case 2
if ($string_length == $keyword_length) {
if ($string == $keyword) return true;
else return false;
}
// case 3
if ($keyword_length == 1) {
for ($i = 0; $i < $string_length; $i++) {
// Check if keyword's first char == string's first char
if ($keyword_first_char == $string[$i]) {
return true;
}
}
}
// case 4
if ($keyword_length > 1) {
for ($i = 0; $i < $string_length; $i++) {
/*
the remaining part of the string is equal or greater than the keyword
*/
if (($string_length + 1 - $i) >= $keyword_length) {
// Check if keyword's first char == string's first char
if ($keyword_first_char == $string[$i]) {
$match = 1;
for ($j = 1; $j < $keyword_length; $j++) {
if (($i + $j < $string_length) && $keyword[$j] == $string[$i + $j]) {
$match++;
}
else {
return false;
}
}
if ($match == $keyword_length) {
return true;
}
// end if first match found
}
// end if remaining part
}
else {
return false;
}
// end for loop
}
// end case4
}
return false;
}
}
测试:
var_dump(is_str_contain("test", "t")); //true
var_dump(is_str_contain("test", "")); //false
var_dump(is_str_contain("test", "test")); //true
var_dump(is_str_contain("test", "testa")); //flase
var_dump(is_str_contain("a----z", "a")); //true
var_dump(is_str_contain("a----z", "z")); //true
var_dump(is_str_contain("mystringss", "strings")); //true
我曾经遇到过一些问题,最后我选择创建自己的解决方案。这个方案不使用正则表达式引擎:
function contains($text, $word)
{
$found = false;
$spaceArray = explode(' ', $text);
$nonBreakingSpaceArray = explode(chr(160), $text);
if (in_array($word, $spaceArray) ||
in_array($word, $nonBreakingSpaceArray)
) {
$found = true;
}
return $found;
}
您可能会注意到,先前的解决方案并不适用于将单词用作另一个单词的前缀。为了使用您的示例:
$a = 'How are you?';
$b = "a skirt that flares from the waist";
$c = "are";
通过上述样例,$a
和 $b
都包含 $c
,但你可能希望你的函数告诉你只有 $a
包含 $c
。
$found = false
。 - slownage有三种不同的方式可以实现:
$a = 'How are you?';
1- stristr()
if (strlen(stristr($a,"are"))>0) {
echo "true"; // are Found
}
2- strpos()
if (strpos($a, "are") !== false) {
echo "true"; // are Found
}
3- preg_match()
if( preg_match("are",$a) === 1) {
echo "true"; // are Found
}
WARNING preg_match(): Delimiter must not be alphanumeric or backslash
。 - Pathros