考虑:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
假设我有上面的代码,编写语句if ($a contains 'are')
的正确方法是什么?
答案 0 :(得分:6165)
您可以使用strpos()
函数来查找另一个字符串中出现的字符串:
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
}
请注意!== false
的使用是故意的; strpos()
返回针字符串在haystack字符串中开始的偏移量,如果未找到针,则返回布尔值false
。由于0是有效偏移量而0是“假”,因此我们不能使用更简单的构造,如!strpos($a, 'are')
。
答案 1 :(得分:532)
你可以使用正则表达式,与其他用户提到的strpos
相比,它更适合单词匹配,对于票价,照顾,凝视等字符串,它也会返回true。这可以简单通过使用单词边界来避免正则表达式。
对于are的简单匹配可能如下所示:
$a = 'How are you?';
if (preg_match('/\bare\b/', $a)) {
echo 'true';
}
在效果方面,strpos
的速度提高了约三倍,请注意,当我同时进行一百万次比较时,花费preg_match
1.5秒完成strpos
花了0.5秒。
编辑: 为了搜索字符串的任何部分,而不是逐字逐句,我建议使用像
这样的正则表达式$a = 'How are you?';
$search 'are y';
if(preg_match("/{$search}/i", $a)) {
echo 'true';
}
正则表达式末尾的i
会将正则表达式更改为不区分大小写,如果您不希望这样,则可以将其保留。
现在,在某些情况下这可能会出现问题,因为$ search字符串没有以任何方式进行清理,我的意思是,在某些情况下它可能无法通过检查,就好像$search
是用户一样输入他们可以添加一些字符串,可能表现得像一些不同的正则表达式......
此外,这是测试和查看各种正则表达式解释的绝佳工具Regex101
要将两组功能组合成一个多功能功能(包括可选的区分大小写),您可以使用以下内容:
function FindString($needle,$haystack,$i,$word)
{ // $i should be "" or "i" for case insensitive
if (strtoupper($word)=="W")
{ // if $word is "W" then word search instead of string in string search.
if (preg_match("/\b{$needle}\b/{$i}", $haystack))
{
return true;
}
}
else
{
if(preg_match("/{$needle}/{$i}", $haystack))
{
return true;
}
}
return false;
// Put quotes around true and false above to return them as strings instead of as bools/ints.
}
答案 2 :(得分:229)
这是一个小实用功能,在这种情况下非常有用
// returns true if $needle is a substring of $haystack
function contains($needle, $haystack)
{
return strpos($haystack, $needle) !== false;
}
答案 3 :(得分:128)
虽然这些答案中的大多数会告诉您字符串中是否出现子字符串,但如果您正在寻找特定的字而不是子字符串<,则通常不是您想要的字符串< / em>的
有什么区别?子字符串可以出现在其他词语中:
缓解这种情况的一种方法是使用与word boundaries(\b
)结合的正则表达式:
function containsWord($str, $word)
{
return !!preg_match('#\\b' . preg_quote($word, '#') . '\\b#i', $str);
}
此方法没有上面提到的相同误报,但它确实有一些自己的边缘情况。单词边界与非单词字符(\W
)匹配,这些字符将是a-z
,A-Z
,0-9
或_
的任何内容。这意味着数字和下划线将被计为单词字符,这样的场景将失败:
如果你想要比这更精确的东西,你将不得不开始进行英语语法解析,这是一个非常大的蠕虫(并假设正确使用语法,无论如何,这并不总是给定)
答案 4 :(得分:109)
要确定字符串是否包含其他字符串,您可以使用PHP函数strpos()。
int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
<?php
$haystack = 'how are you';
$needle = 'are';
if (strpos($haystack,$needle) !== false) {
echo "$haystack contains $needle";
}
?>
<强>注意:强>
如果您要搜索的针头位于干草堆的开头,它将返回位置0,如果进行==
比较不起作用,则需要执行===
< / p>
==
符号是比较并测试左边的变量/ expression / constant是否与右边的变量/ expression / constant具有相同的值。
===
符号是比较两个变量/ expresions / constants是否相等AND
具有相同类型 - 即两者都是字符串或两者都是整数。
答案 5 :(得分:60)
<?php
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);
// Note our use of ===. Simply, == would not work as expected
// because the position of 'a' was the 0th (first) character.
if ($pos === false) {
echo "The string '$findme' was not found in the string '$mystring'.";
}
else {
echo "The string '$findme' was found in the string '$mystring',";
echo " and exists at position $pos.";
}
?>
答案 6 :(得分:58)
答案 7 :(得分:43)
向SamGoody和Lego Stormtroopr发表评论。
如果您正在寻找一种PHP算法根据多个单词的邻近度/相关性对搜索结果进行排名 这里提供了一种使用PHP生成搜索结果的快捷方法:
其他布尔搜索方法的问题,例如strpos()
,preg_match()
,strstr()
或stristr()
基于Vector Space Model和tf-idf (term frequency–inverse document frequency):
的PHP方法这听起来很难,但却非常容易。
如果我们想在字符串中搜索多个单词,核心问题是我们如何为每个单词分配权重?
如果我们可以根据字符串整体的代表性来对字符串中的术语进行加权, 我们可以通过与查询最匹配的结果来排序结果。
这是向量空间模型的概念,与SQL全文搜索的工作方式相差不远:
function get_corpus_index($corpus = array(), $separator=' ') {
$dictionary = array();
$doc_count = array();
foreach($corpus as $doc_id => $doc) {
$terms = explode($separator, $doc);
$doc_count[$doc_id] = count($terms);
// tf–idf, short for term frequency–inverse document frequency,
// according to wikipedia is a numerical statistic that is intended to reflect
// how important a word is to a document in a corpus
foreach($terms as $term) {
if(!isset($dictionary[$term])) {
$dictionary[$term] = array('document_frequency' => 0, 'postings' => array());
}
if(!isset($dictionary[$term]['postings'][$doc_id])) {
$dictionary[$term]['document_frequency']++;
$dictionary[$term]['postings'][$doc_id] = array('term_frequency' => 0);
}
$dictionary[$term]['postings'][$doc_id]['term_frequency']++;
}
//from http://phpir.com/simple-search-the-vector-space-model/
}
return array('doc_count' => $doc_count, 'dictionary' => $dictionary);
}
function get_similar_documents($query='', $corpus=array(), $separator=' '){
$similar_documents=array();
if($query!=''&&!empty($corpus)){
$words=explode($separator,$query);
$corpus=get_corpus_index($corpus, $separator);
$doc_count=count($corpus['doc_count']);
foreach($words as $word) {
if(isset($corpus['dictionary'][$word])){
$entry = $corpus['dictionary'][$word];
foreach($entry['postings'] as $doc_id => $posting) {
//get term frequency–inverse document frequency
$score=$posting['term_frequency'] * log($doc_count + 1 / $entry['document_frequency'] + 1, 2);
if(isset($similar_documents[$doc_id])){
$similar_documents[$doc_id]+=$score;
}
else{
$similar_documents[$doc_id]=$score;
}
}
}
}
// length normalise
foreach($similar_documents as $doc_id => $score) {
$similar_documents[$doc_id] = $score/$corpus['doc_count'][$doc_id];
}
// sort from high to low
arsort($similar_documents);
}
return $similar_documents;
}
案例1
$query = 'are';
$corpus = array(
1 => 'How are you?',
);
$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
print_r($match_results);
echo '</pre>';
<强> RESULT 强>
Array
(
[1] => 0.52832083357372
)
案例2
$query = 'are';
$corpus = array(
1 => 'how are you today?',
2 => 'how do you do',
3 => 'here you are! how are you? Are we done yet?'
);
$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
print_r($match_results);
echo '</pre>';
<强>结果
Array
(
[1] => 0.54248125036058
[3] => 0.21699250014423
)
案例3
$query = 'we are done';
$corpus = array(
1 => 'how are you today?',
2 => 'how do you do',
3 => 'here you are! how are you? Are we done yet?'
);
$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
print_r($match_results);
echo '</pre>';
<强>结果
Array
(
[3] => 0.6813781191217
[1] => 0.54248125036058
)
有很多改进
但该模型提供了一种从自然查询中获得良好结果的方法,
它没有strpos()
,preg_match()
,strstr()
或stristr()
等布尔运算符。
NOTA BENE
可选择在搜索单词之前消除冗余
从而减少索引大小并减少存储需求
减少磁盘I / O
更快的索引编制和更快的搜索速度。
<强> 1。归一化强>
<强> 2。阻止词语
第3。字典替换
将字词替换为具有相同或相似含义的其他字词。 (例如:将'饥饿'和'饥饿'替换为'饥饿')
可以执行进一步的算法测量(滚雪球)以进一步将词语简化为其基本含义。
用十六进制等值替换颜色名称
通过降低精度来减少数值是规范文本的其他方法。
资源
答案 8 :(得分:42)
使用stripos()
使用不区分大小写的匹配:
if (stripos($string,$stringToSearch) !== false) {
echo 'true';
}
答案 9 :(得分:40)
如果您想避免“虚假”和“真相”问题,可以使用substr_count:
if (substr_count($a, 'are') > 0) {
echo "at least one 'are' is present!";
}
它比strpos慢一点,但它避免了比较问题。
答案 10 :(得分:31)
另一种选择是使用strstr()功能。类似的东西:
if (strlen(strstr($haystack,$needle))>0) {
// Needle Found
}
注意:strstr()函数区分大小写。对于不区分大小写的搜索,请使用stristr()函数。
答案 11 :(得分:28)
if (preg_match('/(are)/', $a)) {
echo 'true';
}
答案 12 :(得分:28)
我有点印象,这里没有使用strpos
,strstr
和类似函数提及Multibyte String Functions的答案(2015-05-08)。
基本上,如果你找不到某些语言特有的字词,例如德语,法语,葡萄牙语,西班牙语等(例如:ä ,é,ô,ç,º,ñ),您可能需要使用mb_
在函数之前。因此,接受的答案将使用mb_strpos
或mb_stripos
(对于不区分大小写的匹配):
if (mb_strpos($a,'are') !== false) {
echo 'true';
}
如果您无法保证all your data is 100% in UTF-8,则可能需要使用mb_
功能。
通过 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) 了解 Joel Spolsky 的好文章。
答案 13 :(得分:23)
以下功能也有效,不依赖于任何其他功能;它仅使用本机PHP字符串操作。就个人而言,我不建议这样做,但你可以看到它是如何工作的:
<?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
答案 14 :(得分:22)
在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
选择strpos
或stripos
来完成工作,具体取决于$caseSensitive
的值。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)
答案 15 :(得分:21)
我遇到了一些麻烦,最后我选择创建自己的解决方案。不使用regular expression引擎:
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
。
答案 16 :(得分:21)
您可以使用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 ";
}
答案 17 :(得分:16)
使用strstr()和stristr()查找字符串中单词出现的另一个选项如下:
<?php
$a = 'How are you?';
if (strstr($a,'are')) // Case sensitive
echo 'true';
if (stristr($a,'are')) // Case insensitive
echo 'true';
?>
答案 18 :(得分:14)
简写版
$result = false!==strpos($a, 'are');
答案 19 :(得分:14)
可以通过三种不同的方式完成:
$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
}
答案 20 :(得分:14)
为了找到一个单词&#39;,而不是一系列可能实际上是另一个单词的一部分的字母的出现,以下将是一个很好的解决方案。
$string = 'How are you?';
$array = explode(" ", $string);
if (in_array('are', $array) ) {
echo 'Found the word';
}
答案 21 :(得分:13)
您应该使用不区分大小写的格式,因此如果输入的值在small
或caps
中,则无关紧要。
<?php
$grass = "This is pratik joshi";
$needle = "pratik";
if (stripos($grass,$needle) !== false) {
/*If i EXCLUDE : !== false then if string is found at 0th location,
still it will say STRING NOT FOUND as it will return '0' and it
will goto else and will say NOT Found though it is found at 0th location.*/
echo 'Contains word';
}else{
echo "does NOT contain word";
}
?>
在这里,stripos在heystack 中找到了针,没有考虑案例(小/上限)。
答案 22 :(得分:13)
许多使用substr_count
的答案会检查结果是>0
。但由于if
语句认为same as false为零,因此可以避免直接检查和写入:
if (substr_count($a, 'are')) {
要检查不是否存在,请添加!
运算符:
if (!substr_count($a, 'are')) {
答案 23 :(得分:12)
也许你可以使用这样的东西:
<?php
findWord('Test all OK');
function findWord($text) {
if (strstr($text, 'ok')) {
echo 'Found a word';
}
else
{
echo 'Did not find a word';
}
}
?>
答案 24 :(得分:11)
如果您只想检查另一个字符串中是否包含一个字符串,请不要使用preg_match()
。请改用strpos()
或strstr()
,因为它们会更快。 (http://in2.php.net/preg_match)
if (strpos($text, 'string_name') !== false){
echo 'get the string';
}
答案 25 :(得分:10)
strpos功能正常,但是如果你想for (int i=1; i<=6; i++)
{
for (int j=1; j<=i; j++)
System.out.print("*");
for (int j=1; j<=i; j++)
System.out.print("-");
}
检查一个段落中的单词,那么你可以使用case-insensitive
的{{1}}函数。
例如,
stripos
在字符串中查找第一次出现不区分大小写的子字符串的位置。
如果字符串中没有单词,那么它将返回false,否则它将返回单词的位置。
答案 26 :(得分:10)
如果要检查字符串是否包含多个特定字词,可以执行以下操作:
$badWords = array("dette", "capitale", "rembourser", "ivoire", "mandat");
$string = "a string with the word ivoire";
$matchFound = preg_match_all("/\b(" . implode($badWords,"|") . ")\b/i", $string, $matches);
if ($matchFound) {
echo "a bad word has been found";
}
else {
echo "your string is okay";
}
这有助于在发送电子邮件时避免垃圾邮件。
答案 27 :(得分:9)
您需要使用相同/不相同的运算符,因为strpos可以返回0作为其索引值。如果您喜欢三元运算符,请考虑使用以下内容(似乎有点倒退我会承认):
echo FALSE === strpos($a,'are') ? 'false': 'true';
答案 28 :(得分:8)
检查字符串是否包含特定字词?
这意味着必须将字符串解析为单词(请参阅下面的注释)。
执行此操作并指定分隔符的一种方法是使用 context.users.Where(user=> user.id ==10).Select(user => new user{id=user.id,email= user.email}).FirstOrDefault();
(doc):
preg_split
跑步给出
<?php
function contains_word($str, $word) {
// split string into words
// separators are substrings of at least one non-word character
$arr = preg_split('/\W+/', $str, NULL, PREG_SPLIT_NO_EMPTY);
// now the words can be examined each
foreach ($arr as $value) {
if ($value === $word) {
return true;
}
}
return false;
}
function test($str, $word) {
if (contains_word($str, $word)) {
echo "string '" . $str . "' contains word '" . $word . "'\n";
} else {
echo "string '" . $str . "' does not contain word '" . $word . "'\n" ;
}
}
$a = 'How are you?';
test($a, 'are');
test($a, 'ar');
test($a, 'hare');
?>
注意:这里我们不是指每个符号序列的单词。
单词的实际定义在某种意义上是PCRE正则表达式引擎,其中单词是仅由单词字符组成的子串,由非单词字符分隔。
“word”字符是任何字母或数字或下划线字符, 也就是说,任何可以成为Perl“单词”一部分的字符。该 字母和数字的定义由PCRE的字符控制 表格,如果发生特定于区域设置的匹配(...)
,则可能会有所不同
答案 29 :(得分:7)
可以使用以下函数检查字符串:
function either_String_existor_not($str, $character) {
if (strpos($str, $character) !== false) {
return true;
}
return false;
}
答案 30 :(得分:6)
特定字符串的另一种解决方案:
$subject = 'How are you?';
$pattern = '/are/';
preg_match($pattern, $subject, $match);
if ($match[0] == 'are') {
echo true;
}
您也可以使用strpos()
功能。
答案 31 :(得分:5)
使用:
$text = 'This is a test';
echo substr_count($text, 'is'); // 2
// So if you want to check if is exists in the text just put
// in a condition like this:
if (substr_count($text, 'is') > 0) {
echo "is exists";
}
答案 32 :(得分:4)
一个更简单的选项:
return ( ! empty($a) && strpos($a, 'are'))? true : false;
答案 33 :(得分:4)
我认为最好使用mb_stpos
:
$haystack = 'How are you?';
$needle = 'are';
if (mb_strpos($haystack, $needle) !== false) {
echo 'true';
}
因为此解决方案区分大小写且对所有Unicode字符都是安全的。
但你也可以这样做( sauch响应还没有):
if (count(explode($needle, $haystack)) > 1) {
echo 'true';
}
此解决方案区分大小写且对Unicode字符安全。
此外,你不要使用表达式中的否定,这会增加代码的可读性。
以下是其他解决方案使用功能:
function isContainsStr($haystack, $needle) {
return count(explode($needle, $haystack)) > 1;
}
if (isContainsStr($haystack, $needle)) {
echo 'true';
}
答案 34 :(得分:3)
使用:
$a = 'How are you?';
if (mb_strpos($a, 'are')) {
echo 'true';
}
它执行多字节安全strpos()操作。
答案 35 :(得分:3)
您还可以使用内置函数strchr()
和strrchr()
以及多字节字符串mb_strchr()
和mb_strrchr()
的扩展名。
这些函数返回字符串的一部分,如果没有找到,则返回FALSE
。
strchr()
- 查找字符串的第一个匹配项(是strstr()
的别名)。 strrchr()
- 查找字符串中最后一个字符。