Verifique se o elemento da matriz existe na string

Eu pensei que isso seria uma coisa simples a fazer com uma function php nativa, mas eu encontrei algumas maneiras diferentes, bastante complicadas, de que as pessoas tentaram alcançá-la. Qual é a maneira mais eficiente de verificar se uma seqüência contém um ou mais elementos em uma matriz? ou seja, abaixo – onde $ data [‘description’] é uma string. Obv the in_array check below breaks porque espera que o param 2 seja uma matriz

$keywords = array( 'bus', 'buses', 'train', ); if (!in_array($keywords, $data['description'])) continue; 

Supondo que a String seja uma lista de valores desmoronados / delimitados

 function arrayInString( $inArray , $inString , $inDelim=',' ){ $inStringAsArray = explode( $inDelim , $inString ); return ( count( array_intersect( $inArray , $inStringAsArray ) )>0 ); } 

Exemplo 1:

 arrayInString( array( 'red' , 'blue' ) , 'red,white,orange' , ',' ); // Would return true // When 'red,white,orange' are split by ',', // the 'red' element matched the array 

Exemplo 2:

 arrayInString( array( 'mouse' , 'cat' ) , 'mouse' ); // Would return true // When 'mouse' is split by ',' (the default deliminator), // the 'mouse' element matches the array which contains only 'mouse' 

Supondo que a String é um texto simples, e você está simplesmente procurando instâncias das palavras especificadas dentro dela

 function arrayInString( $inArray , $inString ){ if( is_array( $inArray ) ){ foreach( $inArray as $e ){ if( strpos( $inString , $e )!==false ) return true; } return false; }else{ return ( strpos( $inString , $inArray )!==false ); } } 

Exemplo 1:

 arrayInString( array( 'apple' , 'banana' ) , 'I ate an apple' ); // Would return true // As 'I ate an apple' contains 'apple' 

Exemplo 2:

 arrayInString( array( 'car' , 'bus' ) , 'I was busy' ); // Would return true // As 'bus' is present in the string, even though it is part of 'busy' 

Você pode fazer isso usando expressões regulares –

 if( !preg_match( '/(\b' . implode( '\b|\b', $keywords ) . '\b)/i', $data['description'] )) continue; 

o resultado regexp será /(\bbus\b|\bbuses\b|\btrain\b)/

Supondo que palavras e frases completas estão sendo pesquisadas

Esta function encontrará uma frase (não sensível a maiúsculas e minúsculas) a partir de uma série de frases dentro de uma string. Se encontrado, a frase é reposta e $ posição retorna seu índice dentro da string. Se não for encontrado, ele retorna FALSO.

 function findStringFromArray($phrases, $string, &$position) { // Reverse sort phrases according to length. // This ensures that 'taxi' isn't found when 'taxi cab' exists in the string. usort($phrases, create_function('$a,$b', '$diff=strlen($b)-strlen($a); return $diff<0?-1:($diff>0?1:0);')); // Pad-out the string and convert it to lower-case $string = ' '.strtolower($string).' '; // Find the phrase foreach ($phrases as $key => $value) { if (($position = strpos($string, ' '.strtolower($value).' ')) !== FALSE) { return $phrases[$key]; } } // Not found return FALSE; } 

Para testar a function,

 $wordsAndPhrases = array('taxi', 'bus', 'taxi cab', 'truck', 'coach'); $srch = "The taxi cab was waiting"; if (($found = findStringFromArray($wordsAndPhrases, $srch, $pos)) !== FALSE) { echo "'$found' was found in '$srch' at string position $pos."; } else { echo "None of the search phrases were found in '$srch'."; } 

Por uma questão de interesse, a function demonstra uma técnica para encontrar palavras e frases completas, de modo que o “ônibus” seja encontrado, mas não “abuso”. Apenas envolva o seu palheiro e sua agulha com espaço:

 $pos = strpos(" $haystack ", " $needle ")