php - verifier - vérifier si une chaine contient un caractère java




Comment vérifier si une chaîne contient un mot spécifique? (20)

Considérer:

$a = 'How are you?';

if ($a contains 'are')
    echo 'true';

Supposons que j'ai le code ci-dessus, quelle est la bonne façon d'écrire la déclaration if ($a contains 'are') ?


Vérifier si la chaîne contient des mots spécifiques?

Cela signifie que la chaîne doit être résolue en mots (voir la remarque ci-dessous).

Une façon de faire cela et de spécifier les séparateurs est d'utiliser preg_split ( doc ):

$result = stripos("I love PHP, I love PHP too!", "php");
if ($result === false) {
    // Word does not exist
}
else {
    // Word exists
}

Une course donne

<?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');

?>

Remarque: Ici, nous ne voulons pas dire mot pour chaque séquence de symboles.

Une définition pratique de mot correspond au sens du moteur d’expression régulière PCRE, où les mots sont des sous-chaînes composées uniquement de caractères, séparés par des caractères autres que des mots.

Un caractère "mot" est une lettre ou un chiffre ou le caractère de soulignement, c'est-à-dire tout caractère pouvant faire partie d'un "mot" Perl. La définition des lettres et des chiffres est contrôlée par les tables de caractères de PCRE et peut varier si une correspondance spécifique aux paramètres régionaux est en cours (..)


Afin de trouver un «mot» plutôt que la présence d'une série de lettres qui pourraient en fait faire partie d'un autre mot, voici la solution:

$string = 'How are you?';
$array = explode(" ", $string);

if (in_array('are', $array) ) {
    echo 'Found the word';
}

Bien que la plupart de ces réponses vous indiquent si une sous-chaîne apparaît dans votre chaîne, ce n'est généralement pas ce que vous voulez si vous recherchez un mot en particulier, et non une sous - chaîne .

Quelle est la différence? Les sous-chaînes peuvent apparaître dans d'autres mots:

  • Les "sont" au début de "zone"
  • Les "sont" à la fin du "lièvre"
  • Les "sont" au milieu des "tarifs"

Une façon d’y remédier consiste à utiliser une expression régulière associée à des limites de mots ( \b ):

function containsWord($str, $word)
{
    return !!preg_match('#\\b' . preg_quote($word, '#') . '\\b#i', $str);
}

Cette méthode n'a pas les mêmes faux positifs que ceux mentionnés ci-dessus, mais elle a ses propres cas. Les limites des mots correspondent à des caractères autres que des mots ( \W ), qui ne doivent pas être az , AZ , 0-9 ou _ . Cela signifie que les chiffres et les tirets bas seront comptés comme des mots et que des scénarios comme celui-ci échoueront:

  • Les "sont" dans "Qu'est-ce que vous pensez?"
  • Les "sont" dans "lol u dunno wut ceux qui sont4?"

Si vous voulez quelque chose de plus précis que cela, vous devrez commencer à analyser la syntaxe en anglais, ce qui est une assez grosse boîte de vers (et suppose une utilisation correcte de la syntaxe, de toute façon, ce qui n'est pas toujours évident).


Cela peut être fait de trois manières différentes:

 $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
 }

J'ai eu quelques problèmes avec cela, et finalement j'ai choisi de créer ma propre solution. Sans utiliser le moteur d' expression régulière :

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;
 }

Vous remarquerez peut-être que les solutions précédentes ne constituent pas une réponse pour le mot utilisé comme préfixe pour un autre. Pour utiliser votre exemple:

$a = 'How are you?';
$b = "a skirt that flares from the waist";
$c = "are";

Avec les exemples ci-dessus, $a et $b contiennent $c , mais vous voudrez peut-être que votre fonction vous indique que seul $a contient $c .


Je suis un peu impressionné par le fait qu'aucune des réponses ici qui utilisaient strpos , strstr et les fonctions similaires ne mentionnait encore les fonctions multibyte de chaîne (2015-05-08).

En gros, si vous rencontrez des difficultés pour trouver des mots avec des caractères spécifiques à certaines langues , telles que l'allemand, le français, le portugais, l'espagnol, etc. (par exemple: ä , é , ô , ç , º , ñ ), vous voudrez peut-être précéder les fonctions avec mb_ . Par conséquent, la réponse acceptée utiliserait mb_strpos ou mb_stripos (pour la correspondance insensible à la casse):

if (mb_strpos($a,'are') !== false) {
    echo 'true';
}

Si vous ne pouvez pas garantir que toutes vos données sont à 100% en UTF-8 , vous pouvez utiliser les fonctions mb_ .

Un bon article pour comprendre pourquoi est le minimum absolu que chaque développeur de logiciel a absolument, doit savoir absolument sur Unicode et les jeux de caractères (sans excuses!) De Joel Spolsky .


La version abrégée

$result = false!==strpos($a, 'are');

N'utilisez pas preg_match() si vous souhaitez uniquement vérifier si une chaîne est contenue dans une autre chaîne. Utilisez strpos() ou strstr() place car ils seront plus rapides. ( http://in2.php.net/preg_match )

if (strpos($text, 'string_name') !== false){
   echo 'get the string';
}

Peut-être que vous pourriez utiliser quelque chose comme ceci:

<?php
    findWord('Test all OK');

    function findWord($text) {
        if (strstr($text, 'ok')) {
            echo 'Found a word';
        }
        else
        {
            echo 'Did not find a word';
        }
    }
?>

Pour déterminer si une chaîne contient une autre chaîne, vous pouvez utiliser la fonction 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";
}

?>

MISE EN GARDE:

Si l'aiguille que vous recherchez se trouve au début de la botte de foin, elle retournera la position 0; si vous effectuez une comparaison == qui ne fonctionnera pas, vous devrez effectuer un ===

Un signe == est une comparaison et teste si la variable / expression / constante à gauche a la même valeur que la variable / expression / constante à droite.

Un signe === est une comparaison permettant de voir si deux variables / expressions / constantes sont égales AND ont le même type - en d'autres termes, il s'agit de chaînes ou de nombres entiers.


Si vous voulez vérifier si la chaîne contient plusieurs mots spécifiques, vous pouvez faire:

echo FALSE === strpos($a,'are') ? 'false': 'true';

Ceci est utile pour éviter les spams lors de l'envoi d'emails par exemple.


Une autre option consiste à utiliser la fonction strstr() . Quelque chose comme:

if (strlen(strstr($haystack,$needle))>0) {
// Needle Found
}

Pointez sur la note: la fonction strstr () est sensible à la casse. Pour une recherche ne stristr() la casse, utilisez la fonction stristr() .


Utilisez la correspondance insensible à la casse avec stripos() :

if (substr_count($a, 'are') > 0) {
    echo "at least one 'are' is present!";
}

Voici une petite fonction d’utilité utile dans des situations comme celle-ci.

// returns true if $needle is a substring of $haystack
function contains($needle, $haystack)
{
    return strpos($haystack, $needle) !== false;
}

Vous devez utiliser un format insensible à la casse. Ainsi, si la valeur entrée est en small caps ou en caps cela n'aura aucune importance.

<?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";
}
?>

Ici, stripos trouve une aiguille dans la pile de foin sans tenir compte de l'affaire (petite / casquette).

PHPCode Sample avec sortie


Vous pouvez utiliser des expressions régulières. Il vaut mieux comparer les mots que les strpos mentionnés par d'autres utilisateurs. Il retournera également la valeur true pour des chaînes telles que tarif, soin, regard, etc. Ceci peut simplement être évité dans l'expression régulière en utilisant des limites de mots.

Un match simple pour are pourrait ressembler à ceci:

$a = 'How are you?';

if (preg_match('/\bare\b/',$a))
    echo 'true';

Du côté des performances, les strpos sont environ trois fois plus rapides et n’oubliez pas que lorsque j’ai fait un million de comparaisons à la fois, il a fallu 1,5 secondes pour que le match préliminaire se termine et pour les strpos, il a fallu 0,5 seconde.


Vous pouvez utiliser la fonction strstr :

$haystack = "I know programming";
$needle   = "know";
$flag = strstr($haystack, $needle);

if ($flag){

    echo "true";
}

Sans utiliser une fonction intégrée:

$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 ";
}

strpos() :

<?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.";
    }
?>

Une chaîne peut être vérifiée avec la fonction ci-dessous:

function either_String_existor_not($str, $character) {
    if (strpos($str, $character) !== false) {
        return true;
    }
    return false;
}

La fonction strpos fonctionne bien, mais si vous souhaitez case-insensitiverechercher un mot dans un paragraphe, vous pouvez utiliser la striposfonction PHP.

Par exemple,

$ php -f test.php                   
string 'How are you?' contains word 'are' 
string 'How are you?' does not contain word 'ar'
string 'How are you?' does not contain word 'hare'

Recherchez la position de la première occurrence d'une sous-chaîne insensible à la casse dans une chaîne.

Si le mot n'existe pas dans la chaîne, il retournera false sinon il retournera la position du mot.





string-matching