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($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
strposa
는 모든 텍스트를 통해 실행되지만 반드시 필요한 것은 아닙니다! 이해할 수 있습니까?
foreach($needle as $k => $query) { if(strpos($haystack, $query, $offset) !== false) return $k; }
했으므로 추가 처리를 위해 일치하는 항목의 키를 반환합니다.
아래 코드는이를 수행하는 방법을 보여줄뿐만 아니라 사용하기 쉬운 기능에 추가합니다. "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
배열을 반복하고를 strpos
반환하는 경우 "플래그"값을 설정할 수 있습니다 false
.
$flag = false;
foreach ($find_letters as $letter)
{
if (strpos($string, $letter) === false)
{
$flag = true;
}
}
그런 다음의 값을 확인하십시오 $flag
.
!== flase
그래?
특정 문자가 실제로 문자열에 있는지 확인하려면 strtok 사용하십시오 .
$string = 'abcdefg';
if (strtok($string, 'acd') === $string) {
// not found
} else {
// found
}
질문은 제공된 예제가 단지 "예"일 뿐입니 까 아니면 정확히 찾고있는 것입니까? 여기에는 여러 가지 혼합 된 답변이 있으며 허용되는 답변의 복잡성을 이해하지 못합니다.
여부를 확인하려면 모든 컨텐츠 바늘의 배열이 문자열에 존재하고 신속하게 참 또는 거짓을 반환합니다 :
$string = 'abcdefg';
if(str_replace(array('a', 'c', 'd'), '', $string) != $string){
echo 'at least one of the needles where found';
};
그렇다면 @Leon 에게 크레딧을 제공하십시오 .
여부를 확인하려면 ALL의 값 바늘의 배열이 존재하는 이 경우에서와 같이 문자열에, 세 가지를 모두 'a', 'b'
하고 'c'
당신이 언급처럼, 존재해야합니다 귀하의 "예"로
echo '문자열에서 모든 글자를 찾았습니다!';
여기에 많은 답변이 그 맥락에서 벗어 났지만 해결 된 것으로 표시 한 질문의 의도가 의심됩니다. 예 : 허용되는 대답은 다음의 바늘입니다.
$array = array('burger', 'melon', 'cheese', 'milk');
모든 단어 가 문자열에서 반드시 발견되어야 한다면 ?
그런 다음 "not accepted answers"
이 페이지 에서 몇 가지를 시도해보십시오 .
이것을 시도 할 수 있습니다.
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
이것은 극적으로 빨랐습니다.
나는 나와 비슷한 것을 찾는 사람에게 도움이되기를 희망하는 새로운 답변을 쓰고 있습니다.
이것은 "나는 여러 개의 바늘을 가지고 있고 그것들을 사용하여 단일 문자열을 찾으려고합니다"의 경우에 작동합니다. 그리고 이것이 제가 그것을 찾기 위해 만난 질문입니다.
$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;
}