在搜索字符串时,如何使用strpos
作为针阵列?例如:
$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';
if(strpos($string, $find_letters) !== false)
{
echo 'All the letters are found in the string!';
}
因为在使用它时,它不起作用,如果有这样的东西会很好
答案 0 :(得分:116)
@Dave来自http://www.php.net/manual/en/function.strpos.php#107351
的更新代码段function strposa($haystack, $needles=array(), $offset=0) {
$chr = array();
foreach($needles as $needle) {
$res = strpos($haystack, $needle, $offset);
if ($res !== false) $chr[$needle] = $res;
}
if(empty($chr)) return false;
return min($chr);
}
使用方法:
$string = 'Whis string contains word "cheese" and "tea".';
$array = array('burger', 'melon', 'cheese', 'milk');
if (strposa($string, $array, 1)) {
echo 'true';
} else {
echo 'false';
}
由于true
array
,将返回"cheese"
。
更新:在找到第一根针时停止改进代码:
function strposa($haystack, $needle, $offset=0) {
if(!is_array($needle)) $needle = array($needle);
foreach($needle as $query) {
if(strpos($haystack, $query, $offset) !== false) return true; // stop on first true result
}
return false;
}
$string = 'Whis string contains word "cheese" and "tea".';
$array = array('burger', 'melon', 'cheese', 'milk');
var_dump(strposa($string, $array)); // will return true, since "cheese" has been found
答案 1 :(得分:24)
str_replace要快得多。
n%3 + 1
答案 2 :(得分:15)
以下代码不仅展示了如何操作,还将其置于易于使用的功能中。它是由“jesda”编写的。 (我在网上找到了)
PHP代码:
<?php
/* strpos that takes an array of values to match against a string
* note the stupid argument order (to match strpos)
*/
function strpos_arr($haystack, $needle) {
if(!is_array($needle)) $needle = array($needle);
foreach($needle as $what) {
if(($pos = strpos($haystack, $what))!==false) return $pos;
}
return false;
}
?>
<强>用法:强>
$needle = array('something','nothing');
$haystack = "This is something";
echo strpos_arr($haystack, $needle); // Will echo True
$haystack = "This isn't anything";
echo strpos_arr($haystack, $needle); // Will echo False
答案 3 :(得分:6)
如果strpos
返回false
,您可以遍历数组并设置“标记”值。
$flag = false;
foreach ($find_letters as $letter)
{
if (strpos($string, $letter) === false)
{
$flag = true;
}
}
然后检查$flag
。
答案 4 :(得分:5)
如果您只是想检查某些字符是否确实在字符串中,请使用strtok:
$string = 'abcdefg';
if (strtok($string, 'acd') === $string) {
// not found
} else {
// found
}
答案 5 :(得分:4)
此表达式搜索所有字母:
count(array_filter(
array_map("strpos", array_fill(0, count($letters), $str), $letters),
"is_int")) == count($letters)
答案 6 :(得分:3)
问题是,提供的示例只是一个“示例”或者您正在寻找什么?这里有许多不同的答案,我不理解被接受的答案的复杂性。
要确定字符串中是否存在 ANY 内容 ,快速返回true或false:
$string = 'abcdefg';
if(str_replace(array('a', 'c', 'd'), '', $string) != $string){
echo 'at least one of the needles where found';
};
如果是的话,请将@Leon归功于此。
要确定字符串中所有值 必须存在,就像你提到作为你的“例如”
echo'所有字母都在字符串中找到!';
这里的许多答案都是出于这种情况,但我怀疑你标记为已解决的问题的内涵。例如。接受的答案是
的针'a', 'b'
如果所有这些单词必须在字符串中找到怎么办?
然后在此页面上试用一些'c'
。
答案 7 :(得分:2)
你可以试试这个:
function in_array_strpos($word, $array){
foreach($array as $a){
if (strpos($word,$a) !== false) {
return true;
}
}
return false;
}
答案 8 :(得分:1)
您也可以尝试使用strpbrk()进行否定(没有找到任何字母):
$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';
if(strpbrk($string, implode($find_letters)) === false)
{
echo 'None of these letters are found in the string!';
}
答案 9 :(得分:1)
这是我的方法。迭代字符串中的字符,直到找到匹配项。在更大的针阵列上,这将超过接受的答案,因为它不需要检查每根针以确定已找到匹配。
<property name="hibernate.c3p0.min_size">10</property>
我根据已接受的答案对此进行了基准测试,并且对于超过7 function strpos_array($haystack, $needles = [], $offset = 0) {
for ($i = $offset, $len = strlen($haystack); $i < $len; $i++){
if (in_array($haystack[$i],$needles)) {
return $i;
}
}
return false;
}
的数组,显着更快。
答案 10 :(得分:0)
使用以下代码:
$flag = true;
foreach($find_letters as $letter)
if(false===strpos($string, $letter)) {
$flag = false;
break;
}
然后检查$flag
的值。如果是true
,则找到所有字母。如果没有,那就是false
。
答案 11 :(得分:0)
我正在写一个新答案,希望能帮助任何寻找与我相似的人。
这适用于&#34;我有多根针,我试图用它们找到一个单挑字符串&#34;。这是我遇到的问题。
$i = 0;
$found = array();
while ($i < count($needle)) {
$x = 0;
while ($x < count($haystack)) {
if (strpos($haystack[$x], $needle[$i]) !== false) {
array_push($found, $haystack[$x]);
}
$x++;
}
$i++;
}
$found = array_count_values($found);
数组$found
将包含所有匹配针的列表,具有最高计数值的数组项将是您正在寻找的字符串,您可以使用:
print_r(array_search(max($found), $found));
答案 12 :(得分:0)
回复@binyamin和@Timo ..(没有足够的点来添加评论..)但结果并不包含位置..
下面的代码将返回第一个元素的实际位置,这是strpos要执行的操作。如果您希望找到完全匹配的内容,这非常有用。如果您希望找到多个匹配项,那么首次找到的位置可能毫无意义。
function strposa($haystack, $needle, $offset=0) {
if(!is_array($needle)) $needle = array($needle);
foreach($needle as $query) {
$res=strpos($haystack, $query, $offset);
if($res !== false) return $res; // stop on first true result
}
return false;
}
答案 13 :(得分:0)
只是从上面的答案升级
function strsearch($findme, $source){
if(is_array($findme)){
if(str_replace($findme, '', $source) != $source){
return true;
}
}else{
if(strpos($source,$findme)){
return true;
}
}
return false;
}
答案 14 :(得分:0)
<?php
$Words = array("hello","there","world");
$c = 0;
$message = 'Hi hello';
foreach ($Words as $word):
$trial = stripos($message,$word);
if($trial != true){
$c++;
echo 'Word '.$c.' didnt match <br> <br>';
}else{
$c++;
echo 'Word '.$c.' matched <br> <br>';
}
endforeach;
?>
我用这种代码来检查hello,它也有编号功能。 如果您想在需要用户输入的网站中进行内容审核,则可以使用此功能
答案 15 :(得分:0)
如果我只想找出大海捞针中是否存在任何针,我使用
可重复使用的功能
function strposar($arrayOfNeedles, $haystack){
if (count(array_filter($arrayOfNeedles, function($needle) use($haystack){
return strpos($haystack, $needle) !== false;
})) > 0){
return true;
} else {
return false;
}
}
strposar($arrayOfNeedles, $haystack); //returns true/false
或 lambda 函数
if (count(array_filter($arrayOfNeedles, function($needle) use($haystack){
return strpos($haystack, $needle) !== false;
})) > 0){
//found so do this
} else {
//not found do this instead
}