PHP Несколько операторов 'stripos' - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь выполнить поиск в строках, чтобы найти строки, которые содержат любой набор слов, но не другой набор.

Пока что я использую вложенные операторы stripos, например:

            if(stripos($name, "Name", true))
            {
                if((stripos($name, "first", true)) || (stripos($name, "for", true)) || (stripos($name, "1", true)))
                {
                    if(stripos($name, "error"))
                    {

Мало того, что это на самом деле не работает, это также кажется излишне многословным.

Можно ли как-нибудь сконструировать простую строку, чтобы сказать: «если эта строка содержит какое-либо из этих слов , но ни одно из этих слов , тогда сделайте это»?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Черные и белые списки.

$aWhitelist = [ "Hi", "Yes" ];
$aBlacklist = [ "Bye", "No" ];

function hasWord( $sText, $aWords ) {
    foreach( $aWords as $sWord ) {
        if( stripos( $sText, $sWord ) !== false ) {
            return true;
        }
    }
    return false;
}

// Tests
$sText1 = "Hello my friend!"; // No match // false
$sText2 = "Hi my friend!"; // Whitelist match // true
$sText3 = "Hi my friend, bye!"; // Whitelist match, blacklist match // false
$sText4 = "M friend no!"; // Blacklist match // false

var_dump( hasWord( $sText1, $aWhitelist ) && !hasWord( $sText1, $aBlacklist ) );
var_dump( hasWord( $sText2, $aWhitelist ) && !hasWord( $sText2, $aBlacklist ) );
var_dump( hasWord( $sText3, $aWhitelist ) && !hasWord( $sText3, $aBlacklist ) );
var_dump( hasWord( $sText4, $aWhitelist ) && !hasWord( $sText4, $aBlacklist ) );
0 голосов
/ 26 июня 2018

Вы можете легко сжать это как таковое;

if(
    stripos($name, "Name", true) &&
    (stripos($name, "first", true)) || (stripos($name, "for", true)) || (stripos($name, "1", true)) &&
    stripos($name, "error")
)
{
    /* Your code */
}

Вы также можете сделать следующее, что будет работать лучше (IMO);

if(
    stristr($name, "Name") &&
    (stristr($name, "first") || stristr($name, "for") || stristr($name, "1")) &&
    stristr($name, "error")
)
{
    /* Your code */
}
...