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?
Respuestas:
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.
fuente
else
bloque debe ir por debajo delforeach
bucle.**Note**: If you only want to determine if a particular needle occurs within haystack, use the faster and less memory intensive function strpos() instead.
site3.com
. Que coincidirámysite3.com
cuando no deberíaPrueba 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
fuente
My url is https://website3.com
Simple
str_replace
con 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
fuente
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"; }
fuente
$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)
fuente
create_function
está en desuso en PHP 7.2Creo 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"; }
fuente
addcslashes(implode('|', $owned_urls_array, '.'))
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
La función de los stripos no es muy estricta. no distingue entre mayúsculas y minúsculas o puede coincidir con una parte de una palabra http://php.net/manual/ro/function.stripos.php
si desea que la búsqueda distinga entre mayúsculas y minúsculas, use strpos http://php.net/manual/ro/function.strpos.php
para conocer la coincidencia exacta, use regex ( preg_match ), consulte la respuesta de este tipo https://stackoverflow.com/a/25633879/4481831
fuente
stripos
Si su
$string
siempre es consistente (es decir, el nombre de dominio siempre está al final de la cadena), puede usarexplode()
conend()
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
fuente
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 }
fuente
$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'; }
fuente
Está comprobando la cadena completa con los valores de la matriz. Entonces la salida es siempre
false
.Yo uso ambos
array_filter
ystrpos
en 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";
fuente
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)
fuente
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" }
fuente
$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';
fuente
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!
Cree una nueva variable
$newStr
reemplazando el valor en la matriz de la cadena original.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.
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.
fuente
$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
ex:
fuente
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
fuente
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.
fuente