Compruebe si la cadena contiene un valor en la matriz

82

Estoy tratando de detectar si una cadena contiene al menos una URL almacenada en una matriz.

Aquí está mi matriz:

$owned_urls = array('website1.com', 'website2.com', 'website3.com');

El usuario ingresa la cadena y la envía a través de PHP. En la página de confirmación, me gustaría verificar si la URL ingresada está en la matriz.

He probado lo siguiente:

$string = 'my domain name is website3.com';
if (in_array($string, $owned_urls))
{
    echo "Match found"; 
    return true;
}
else
{
    echo "Match not found";
    return false;
}

No importa lo que se ingrese, el resultado es siempre "Coincidencia no encontrada".

¿Es esta la forma correcta de hacer las cosas?

danyo
fuente
Mira mi respuesta, creo que la encontrarás útil.
FarrisFahad

Respuestas:

88

Prueba esto.

$string = 'my domain name is website3.com';
foreach ($owned_urls as $url) {
    //if (strstr($string, $url)) { // mine version
    if (strpos($string, $url) !== FALSE) { // Yoshi version
        echo "Match found"; 
        return true;
    }
}
echo "Not found!";
return false;

Utilice stristr () o stripos () si desea marcar sin distinción entre mayúsculas y minúsculas.

Daniele Vrut
fuente
3
Casi: esto hará eco de "Coincidencia no encontrada" y devolverá falso si la primera URL de la lista no coincide, incluso si otra lo hace. El contenido del elsebloque debe ir por debajo del foreachbucle.
Ulrich Schmidt-Goertz
Gracias por ver esto. Acabo de mejorar mi respuesta.
Daniele Vrut
También te has perdido un ")" después de $ string :)
danyo
7
del manual:**Note**: If you only want to determine if a particular needle occurs within haystack, use the faster and less memory intensive function strpos() instead.
Yoshi
5
@danyo esto no funcionará si el usuario ingresa un dominio como site3.com. Que coincidirá mysite3.comcuando no debería
billyonecan
22

Prueba esto:

$owned_urls= array('website1.com', 'website2.com', 'website3.com');

$string = 'my domain name is website3.com';

$url_string = end(explode(' ', $string));

if (in_array($url_string,$owned_urls)){
    echo "Match found"; 
    return true;
} else {
    echo "Match not found";
    return false;
}

- Gracias

Anand Solanki
fuente
8
Esto supone que las cadenas están separadas por un espacio. por ejemplo, no funcionará para la siguiente cadenaMy url is https://website3.com
Елин Й.
4
e incluso no funcionará para 'Tengo el dominio website3.com'. Esto supone que la cadena está al final, lo que no se puede hacer cuando se trabaja con texto comprometido por el usuario
Samuël Visser
20

Simple str_replacecon parámetro de recuento funcionaría aquí:

$count = 0;
str_replace($owned_urls, '', $string, $count);
// if replace is successful means the array value is present(Match Found).
if ($count > 0) {
  echo "One of Array value is present in the string.";
}

Más información: https://www.techpurohit.com/extended-behaviour-explode-and-strreplace-php

jitendrapurohit
fuente
Bien, tengo una duda ... esto funciona bien para hacer coincidir la URL de la cadena ... Tengo una cadena $ string = 'you-are-nice'; $ string2 = 'eres-más-amable'; y mi $ coincidencia = 'agradable'; Necesito hacer coincidir la palabra agradable, no mejor, incluso si mi cadena de coincidencias es agradable ...
Srinivas08
15

Esto fue mucho más fácil de hacer si todo lo que desea hacer es encontrar una cadena en una matriz.

$array = ["they has mystring in it", "some", "other", "elements"];
if (stripos(json_encode($array),'mystring') !== false) {
echo "found mystring";
}
Joseph Philbert
fuente
1
Su matriz de entrada es en realidad una cadena.
Burgi
3
Creo que esta es la MEJOR RESPUESTA, pero no recibí votos positivos debido a un simple error en el código. @Burgi Edité la respuesta y ahora es una matriz e incluso más, ¡múltiples submatrices y su método todavía funciona muy bien!
Tarik
Esto funciona bien, pero no le dice con qué clave coincide la matriz.
ahinkle
8
$string = 'my domain name is website3.com';
$a = array('website1.com','website2.com','website3.com');

$result = count(array_filter($a, create_function('$e','return strstr("'.$string.'", $e);')))>0; 
var_dump($result );

salida

bool(true)
RafH
fuente
2
para referencia; create_functionestá en desuso en PHP 7.2
Darryl E. Clarke
6

Creo que una forma más rápida es usar preg_match .

$user_input = 'Something website2.com or other';
$owned_urls_array = array('website1.com', 'website2.com', 'website3.com');

if ( preg_match('('.implode('|',$owned_urls_array).')', $user_input)){
    echo "Match found"; 
}else{
    echo "Match not found";
}
vencedor
fuente
4
Gracias por este fragmento de código, que puede proporcionar ayuda inmediata y limitada. Una explicación adecuada mejoraría enormemente su valor a largo plazo al mostrar por qué es una buena solución al problema y lo haría más útil para futuros lectores con otras preguntas similares. Por favor, editar su respuesta a añadir un poco de explicación, incluyendo los supuestos realizados. ref
Alper t. Turker
Creo que es la mejor respuesta
dryobs
Para estar más seguros, los puntos deben escaparse en el patrón:addcslashes(implode('|', $owned_urls_array, '.'))
dryobs
menos código, pero definitivamente mucho MUCHO más lento que strpos
hndcrftd
4

Aquí hay una mini-función que busca todos los valores de una matriz en una cadena dada. Utilizo esto en mi sitio para verificar que la IP del visitante esté en mi lista de permitidos en ciertas páginas.

function array_in_string($str, array $arr) {
    foreach($arr as $arr_value) { //start looping the array
        if (stripos($str,$arr_value) !== false) return true; //if $arr_value is found in $str return true
    }
    return false; //else return false
}

cómo utilizar

$owned_urls = array('website1.com', 'website2.com', 'website3.com');

//this example should return FOUND
$string = 'my domain name is website3.com';
if (array_in_string($string, $owned_urls)) {
    echo "first: Match found<br>"; 
}
else {
    echo "first: Match not found<br>";
}

//this example should return NOT FOUND
$string = 'my domain name is website4.com';
if (array_in_string($string, $owned_urls)) {
    echo "second: Match found<br>"; 
}
else {
    echo "second: Match not found<br>";
}

DEMO: http://phpfiddle.org/lite/code/qf7j-8m09

crisc82
fuente
1
distingue entre mayúsculas y minúsculas, para una versión que no distingue entre mayúsculas y minúsculasstripos
hndcrftd
3

Si su $stringsiempre es consistente (es decir, el nombre de dominio siempre está al final de la cadena), puede usar explode()con end()y luego usarin_array() para verificar una coincidencia (como lo señaló @Anand Solanki en su respuesta).

De lo contrario, sería mejor usar una expresión regular para extraer el dominio de la cadena y luego usarlo in_array()para buscar una coincidencia.

$string = 'There is a url mysite3.com in this string';
preg_match('/(?:http:\/\/)?(?:www.)?([a-z0-9-_]+\.[a-z0-9.]{2,5})/i', $string, $matches);

if (empty($matches[1])) {
  // no domain name was found in $string
} else {
  if (in_array($matches[1], $owned_urls)) {
    // exact match found
  } else {
    // exact match not found
  }
}

La expresión anterior probablemente podría mejorarse (no estoy particularmente informado en esta área)

Aquí hay una demostración

billyonecan
fuente
2

Puede concatenar los valores de la matriz con implosión y un separador de | y luego use preg_match para buscar el valor.

Aquí está la solución que se me ocurrió ...

$emails = array('@gmail', '@hotmail', '@outlook', '@live', '@msn', '@yahoo', '@ymail', '@aol');
$emails = implode('|', $emails);

if(!preg_match("/$emails/i", $email)){
 // do something
}
FarrisFahad
fuente
debería ser la respuesta marcada para ser elegante
ceyquem
1
$owned_urls= array('website1.com', 'website2.com', 'website3.com');
    $string = 'my domain name is website3.com';
    for($i=0; $i < count($owned_urls); $i++)
    {
        if(strpos($string,$owned_urls[$i]) != false)
            echo 'Found';
    }   
Sandesh
fuente
1

Está comprobando la cadena completa con los valores de la matriz. Entonces la salida es siempre false.

Yo uso ambos array_filtery strposen este caso.

<?php
$urls= array('website1.com', 'website2.com', 'website3.com');
$string = 'my domain name is website3.com';
$check = array_filter($urls, function($url){
    global $string;
    if(strpos($string, $url))
        return true;
});
echo $check?"found":"not found";
revo
fuente
0

No está utilizando la función in_array ( http://php.net/manual/en/function.in-array.php ) correctamente:

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

El $ needle debe tener un valor en la matriz, por lo que primero debe extraer la URL de la cadena (con una expresión regular, por ejemplo). Algo como esto:

$url = extrctUrl('my domain name is website3.com');
//$url will be 'website3.com'
in_array($url, $owned_urls)
David Fernandes
fuente
0

Si está tratando de obtener una coincidencia exacta de palabras (sin tener rutas dentro de las URL)

$string = 'my domain name is website3.com';
$words = explode(' ', $string); 
$owned_urls= array('website1.com', 'website2.com', 'website3.com');
var_dump(array_intersect($words, $owned_urls));

Salida:

array(1) { [4]=> string(12) "website3.com" }
Taha Paksu
fuente
0
    $message = "This is test message that contain filter world test3";

    $filterWords = array('test1', 'test2', 'test3');

    $messageAfterFilter =  str_replace($filterWords, '',$message);

    if( strlen($messageAfterFilter) != strlen($message) )
        echo 'message is filtered';
    else
        echo 'not filtered';
Tahir Jamil
fuente
0

Encuentro esto rápido y simple sin ejecutar un bucle.

$array = array("this", "that", "there", "here", "where");
$string = "Here comes my string";
$string2 = "I like to Move it! Move it";

$newStr = str_replace($array, "", $string);

if(strcmp($string, $newStr) == 0) {
    echo 'No Word Exists - Nothing got replaced in $newStr';
} else {
    echo 'Word Exists - Some Word from array got replaced!';
}

$newStr = str_replace($array, "", $string2);

if(strcmp($string2, $newStr) == 0) {
    echo 'No Word Exists - Nothing got replaced in $newStr';
} else {
    echo 'Word Exists - Some Word from array got replaced!';
}

¡Pequeña explicación!

  1. Cree una nueva variable $newStrreemplazando el valor en la matriz de la cadena original.

  2. Haga una comparación de cadenas: si el valor es 0, eso significa que las cadenas son iguales y no se reemplazó nada, por lo que no existe ningún valor en la matriz en la cadena.

  3. si es viceversa de 2, es decir, mientras se realiza la comparación de cadenas, no se coincidió con la cadena original y la nueva, eso significa que algo se reemplazó, por lo tanto, el valor en la matriz existe en la cadena.

usuario3767643
fuente
0
  $search = "web"
    $owned_urls = array('website1.com', 'website2.com', 'website3.com');
          foreach ($owned_urls as $key => $value) {
         if (stristr($value, $search) == '') {
        //not fount
        }else{
      //found
       }

este es el mejor enfoque de búsqueda para cualquier subcadena, no distingue entre mayúsculas y minúsculas y es rápido

como si fuera mysql

ex:

seleccione * de la tabla donde nombre = "% web%"

Yahya Ayyoub
fuente
0

Se me ocurrió esta función que funciona para mí, espero que esto ayude a alguien

$word_list = 'word1, word2, word3, word4';
$str = 'This string contains word1 in it';

function checkStringAgainstList($str, $word_list)
{
  $word_list = explode(', ', $word_list);
  $str = explode(' ', $str);

  foreach ($str as $word):
    if (in_array(strtolower($word), $word_list)) {
        return TRUE;
    }
  endforeach;

  return false;
}

Además, tenga en cuenta que las respuestas con strpos () devolverán verdadero si la palabra coincidente es parte de otra palabra. Por ejemplo, si la lista de palabras contiene 'st' y si su cadena contiene 'calle', strpos () devolverá verdadero

Da principiante
fuente
-3

GRACIAS por esto: acabo de usar esta respuesta a la pregunta original para desarrollar un verificador de página de error 404 fácil de usar, para usar en páginas de error 404 personalizadas.

Aquí va:

Necesita una matriz de LivePages en su sitio, a través de matriz / DB, etc., incluso una lista de sus <dir> árbol hará esto con modificaciones:

Usando IDEA original, pero usando texto similar en lugar de strpos, esto le brinda la posibilidad de buscar nombres LIKE, por lo que también permite TYPOS, para que pueda evitar o encontrar nombres Sound-a-like y Look-a-like ...

<?php
// We need to GRAB the URL called via the browser ::
$requiredPage = str_replace ('/', '',$_SERVER[REQUEST_URI]);

// We need to KNOW what pages are LIVE within the website ::
$livePages = array_keys ($PageTEXT_2col );

foreach ($livePages as $url) {

if (similar_text($requiredPage,  $url, $percent)) {
    $percent = round($percent,2); // need to avoid to many decimal places ::
    //   if (strpos($string, $url) !== FALSE) { // Yoshi version
    if (round($percent,0) >= 60) { // set your percentage of "LIKENESS" higher the refiner the search in your array ::
        echo "Best Match found = " . $requiredPage . " > ,<a href='http://" . $_SERVER['SERVER_NAME'] . "/" . $url . "'>" . $url . "</a> > " . $percent . "%"; 
        return true;
    } 
}
}    
echo "Sorry Not found = " . $requiredPage; 
return false;
?>

Espero que esto ayude a alguien, como este artículo me ha ayudado a crear una búsqueda / coincidencia muy simple en una página 404ErrorDoc.

El diseño de la página permitirá al servidor presentar posibles coincidencias de URL con cualquier URL llamada a través del navegador ...

Funciona, y es tan simple, tal vez haya mejores formas de hacerlo, pero de esta manera funciona.

madesignUK
fuente