搜索字符串时如何使用strpos
指针数组?例如:
$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';
if(strpos($string, $find_letters) !== false)
{
echo 'All the letters are found in the string!';
}
因为用这个的时候就不行了,要是有这样的就好了
@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(string $haystack, array $needles, int $offset = 0): bool
{
foreach($needles as $needle) {
if(strpos($haystack, $query, $offset) !== false) {
return true; // stop on first true result
}
}
return false;
}
$string = 'This string contains word "cheese" and "tea".';
$array = ['burger', 'melon', 'cheese', 'milk'];
var_dump(strposa($string, $array)); // will return true, since "cheese" has been found
str_replace 要快得多。
$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';
$match = (str_replace($find_letters, '', $string) != $string);
下面的代码不仅展示了如何做到这一点,而且还把它放在一个易于使用的函数中。它是由“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
问题是,提供的示例只是“示例”还是您正在寻找的确切内容?这里有很多混合的答案,我不明白接受的答案的复杂性。
要找出字符串中是否存在针数组的任何内容,并快速返回 true 或 false:
$string = 'abcdefg';
if(str_replace(array('a', 'c', 'd'), '', $string) != $string){
echo 'at least one of the needles where found';
};
如果是这样,请为此给予@Leon功劳。
找出字符串中是否存在针数组的所有值,在这种情况下,所有三个和必须存在,就像你提到的“例如”'a', 'b'
'c'
echo '所有字母都在字符串中!';
这里的许多答案都超出了这种背景,但我怀疑您标记为已解决的问题的内涵。例如,接受的答案是针
$array = array('burger', 'melon', 'cheese', 'milk');
如果必须在字符串中找到所有这些单词怎么办?
"not accepted answers"
然后你在这个页面上尝试一些。
strpos
如果返回,您可以遍历数组并设置“标志”值false
。
$flag = false;
foreach ($find_letters as $letter)
{
if (strpos($string, $letter) === false)
{
$flag = true;
}
}
然后检查 的值$flag
。
如果您只想检查某些字符是否确实在字符串中,请使用strtok:
$string = 'abcdefg';
if (strtok($string, 'acd') === $string) {
// not found
} else {
// found
}
此表达式搜索所有字母:
count(array_filter(
array_map("strpos", array_fill(0, count($letters), $str), $letters),
"is_int")) == count($letters)
你可以试试这个:
function in_array_strpos($word, $array){
foreach($array as $a){
if (strpos($word,$a) !== false) {
return true;
}
}
return false;
}
您也可以尝试使用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!';
}
这是我的方法。遍历字符串中的字符,直到找到匹配项。在更大的针头阵列上,这将优于接受的答案,因为它不需要检查每根针头来确定已找到匹配项。
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;
}
我将此与接受的答案进行了基准测试,并且使用超过 7 个的数组,$needles
这大大加快了速度。
使用以下代码:
$flag = true;
foreach($find_letters as $letter)
if(false===strpos($string, $letter)) {
$flag = false;
break;
}
然后检查 的值$flag
。如果是true
,则已找到所有字母。如果不是,那就是false
。
我正在写一个新的答案,希望能帮助任何寻找与我相似的人。
这适用于“我有多根针并且我正在尝试使用它们来找到一个单独的字符串”的情况。这就是我遇到的问题。
$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));
回复@binyamin 和@Timo ..(添加评论的点数不足..)但结果不包含位置..
下面的代码将返回第一个元素的实际位置,这是 strpos 的意图做。如果您希望准确找到 1 个匹配项,这将很有用。如果您希望找到多个匹配项,那么第一个找到的位置可能毫无意义。
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;
}
只是上述答案的升级
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;
}
<?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;
?>
我用这种代码来检查你好,它也有编号功能。如果您想在需要用户输入的网站中进行内容审核实践,您可以使用它
如果我只是想找出大海捞针中是否存在任何针,我使用
可重用函数
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
}