Intercettare se parola nell'array è singolare o plurale

  • Creatore Discussione Creatore Discussione Shyson
  • Data di inizio Data di inizio

Shyson

Utente Attivo
19 Ago 2012
1.179
1
38
Questo è l'array

PHP:
<?php
$paroleArray = array ("mel(a|e)");

Questo il codice js che le intercetta correttamente, sa distinguere e mette a video se sing. o plur.

PHP:
<?php
include ("parole-proibite.php");
$paroleProibite = implode("|",$paroleArray);
?>

<script type="text/javascript">
function parolaNo(){ 
var modulo = document.forms.mioform1;
var parole = /\b(<?php echo $paroleProibite; ?>)\b/i; 
var nomiCampi = ["nome","citta","messaggio"];
for (idCampo = 0; idCampo < nomiCampi.length; idCampo++) {
var campo = modulo.elements[nomiCampi[idCampo]];
if (parole.test(campo.value)) {
campo.style.borderColor = 'black'
campo.style.backgroundColor = '#d8ecff'
document.getElementById(''+nomiCampi[idCampo]).innerHTML = "La parola \"" + campo.value.match(parole)[0] + "\" non è ammessa";
campo.focus();
return false;
}
else {
document.getElementById(''+nomiCampi[idCampo]).innerHTML = "";
} 
 }
return true; 
}
</script>

Questo il codice php che la trova ma non distingue cioè, a video scrive "La parola mel(a|e) non è ammessa"

PHP:
include("parole-proibite.php");

$stringa = $_POST['nome'].' '.$citta.' '.$messaggio; 
foreach($paroleArray as $parola) {
if (preg_match("/\b" . $parola . "\b/i", $stringa)) {
$errore .= "La parola $parola non è ammessa />";
 }
}
 
Qualcosa tipo:
PHP:
$arr=array("a"=>"e",... )
$str = "mele";
foreach ($arr as $sing=>$plur)
{
if (substr($str,-1) == $sing)
echo "$str è singolare. Plurale: ".substr($str,0,(strlen($str)-1)).$plur;
}

Ma come sistema di riconoscimento è un po' debole.
 
Qualcosa tipo:
PHP:
$arr=array("a"=>"e",... )
$str = "mele";
foreach ($arr as $sing=>$plur)
{
if (substr($str,-1) == $sing)
echo "$str è singolare. Plurale: ".substr($str,0,(strlen($str)-1)).$plur;
}

Ma come sistema di riconoscimento è un po' debole.

Non funziona, non elabora i dati.

La funzione parolaNo(), funziona sia su js e php, solo che js riconosce se singolare o plurale e mette a video esattamente come è stata inserita nel campo.

Php invece stampa mel(a|e)
 
Una funzione che ho realizzato sulla base della tua:
PHP:
function detectBadWords($text, array $badWords)
{
    $detected = array();

    foreach ($badWords as $badWord) {
        if (preg_match("/\b{$badWord}/i", $text, $matches)) {
            $detected[] = $matches[0];
        }
    }

    return $detected;
}
Passando il testo come primo parametro e le parole da rilevare come secondo parametro restituisce un array contenente le parole rilevate (o un array vuoto se non ce ne sono). Testata.
 
Una funzione che ho realizzato sulla base della tua:
PHP:
function detectBadWords($text, array $badWords)
{
    $detected = array();

    foreach ($badWords as $badWord) {
        if (preg_match("/\b{$badWord}/i", $text, $matches)) {
            $detected[] = $matches[0];
        }
    }

    return $detected;
}
Passando il testo come primo parametro e le parole da rilevare come secondo parametro restituisce un array contenente le parole rilevate (o un array vuoto se non ce ne sono). Testata.

In questo codice non ci sono i nomi dei campi, come fa a saperlo?
 
Lo devi passare tu come primo parametro:
PHP:
$words = array('mel(a|e)', 'cavalier(e|i)', 'cas(a|e)');

$detected = detectBadWords($_POST['nome'], $words);
// ...

Ho messo coi ma non va, sbaglio qualcosa? Cos'è quel $words?

PHP:
<?php
include ("parole-proibite.php");
$paroleProibite = implode("|",$paroleArray);
?>

function detectBadWords($text, array $paroleArray) { 
$stringa = detectBadWords($_POST['nome'], $words);  
$stringa = array(); 
foreach ($paroleArray as $parola) { 
if (preg_match("/\b{$parola}\b/i", $stringa)) { 
 $detected[] = $matches[0]; 
} 
 } 
return $detected; 
}
 
Ultima modifica:
Mi pare che tu non abbia una grande esperienza con PHP... Forse sarebbe meglio leggere una guida completa per capire i concetti di funzione, parametro e argomento. Comunque immagino che la versione giusta fosse questa:
PHP:
<?php
require_once 'parole-proibite.php';

$badWords = detectBadWords($_POST['nome'], $paroleArray);

if (!empty($badWords)) {
    die('Le seguenti parole sono proibite: ' . implode(', ', $badWords));
}
?>
 
Mi pare che tu non abbia una grande esperienza con PHP... Forse sarebbe meglio leggere una guida completa per capire i concetti di funzione, parametro e argomento. Comunque immagino che la versione giusta fosse questa:
PHP:
<?php
require_once 'parole-proibite.php';

$badWords = detectBadWords($_POST['nome'], $paroleArray);

if (!empty($badWords)) {
    die('Le seguenti parole sono proibite: ' . implode(', ', $badWords));
}
?>

Di base è come il mio, questo funziona, come ti dicevo, l'unico problema è che non riconosce se è singolare o plurale, lui vede che sta passando una parola che ho nell'array e mi stampa la parola come l'ho scritta io nell'array es. mel(a|e)

PHP:
$stringa = $_POST['nome'].' '.$citta.' '.$suoemail.' '.$messaggio;
foreach($paroleArray as $parola) {
if (preg_match("/\b" . $parola . "\b/i", $stringa)) {
$errore .= "La parola $parola non è ammessa";
 }
}
 
Se usi la funzione scritta da me, restituisce le parole trovate nel testo, quindi solo la versione singolare o solo quella plurale. Ti faccio un esempio:
PHP:
<?php
function detectBadWords($text, array $badWords)
{
    $detected = array();

    foreach ($badWords as $badWord) {
        if (preg_match("/\b{$badWord}/i", $text, $matches)) {
            $detected[] = $matches[0];
        }
    }

    return $detected;
}

$text = 'mela case';

print_r(detectBadWords($text, array('mel(a|e)', 'cas(a|e)')));
Risultato a video:
Codice:
Array
(
    [0] => mela
    [1] => case
)
Che, se non sbaglio, è quello che vuoi tu.
 
Qualcosa non mi quadra, ho inserito esattamente il tuo codice

PHP:
function detectBadWords($text, array $badWords) {
$detected = array();
foreach ($badWords as $badWord) {
if (preg_match("/\b{$badWord}/i", $text, $matches)) {
$detected[] = $matches[0];
}
}
return $detected;
}
$text = 'mela case';

print_r(detectBadWords($text, array('mel(a|e)', 'cas(a|e)')));

poi in un campo qualsiasi del mio form ho scritto mela e ha stampato Array ( [0] => mela [1] => case )

Poi ho scritto mele e ha stampato sempre Array ( [0] => mela [1] => case )

non ha riconosciuto la differenza
 
Il primo argomento è il testo da analizzare.
Il secondo argomento sono le parole da cercare.

Se vuoi cercare in $_POST['nome'], devi passare $_POST['nome'] come primo argomento.
Lo stesso vale per le stringhe statiche, ma dubito che a te servano.
 
Il primo argomento è il testo da analizzare.
Il secondo argomento sono le parole da cercare.

Se vuoi cercare in $_POST['nome'], devi passare $_POST['nome'] come primo argomento.
Lo stesso vale per le stringhe statiche, ma dubito che a te servano.

È molto simile al mio al quale ci manca qualcosa, sto tentando di modificarlo come il tuo ma è triste...

PHP:
$stringa = $_POST['nome'].' '.$citta.' '.$messaggio; 
foreach($paroleArray as $parola) {
if (preg_match("/\b" . $parola . "\b/i", $stringa)) {
$errore .= "La parola $parola non è ammessa />";
 }
}
 
PHP:
if (preg_match("/\b" . $parola . "\b/i", $stringa), $matches) {
    $errore .= "La parola $matches[0] non è ammessa />";
}

Non va, ha dell'incredibile

PHP:
$stringa = $_POST['nome'].' '.$citta.' '.$messaggio;  
foreach($paroleArray as $parola) { 
if (preg_match("/\b" . $parola . "\b/i", $stringa), $matches) {
$errore .= "La parola $matches[0] non è ammessa />"; 
 } 
}
 
Io qui non riesco a venirne fuori

PHP:
$stringa = $_POST['nome'].' '.$citta.' '.$messaggio;
foreach($paroleArray as $parola) {
if (preg_match("/\b" .$parola ."\b/i", $stringa, $matches)) { 
$stringa[] = $matches[0];
$errore .= "La parola $matches[0] non è ammessa />";  
  }
 }
 
Sì, avevo sbagliato io all'inizio una parentesi:
PHP:
$stringa = $_POST['nome'] . ' ' . $citta . ' ' . $messaggio;

foreach($paroleArray as $parola) { 
    if (preg_match("/\b" . $parola . "\b/i", $stringa, $matches) {
        $errore .= "La parola $matches[0] non è ammessa />"; 
    } 
}
P.S. Ma perché c'è /> dopo "ammessa"?
 
Sì, avevo sbagliato io all'inizio una parentesi:
PHP:
$stringa = $_POST['nome'] . ' ' . $citta . ' ' . $messaggio;

foreach($paroleArray as $parola) { 
    if (preg_match("/\b" . $parola . "\b/i", $stringa, $matches) {
        $errore .= "La parola $matches[0] non è ammessa />"; 
    } 
}
P.S. Ma perché c'è /> dopo "ammessa"?

Quel /> non c'entrava, l'ho tolto.

Ora sembra funzionare, si tratta di togliere il tuo array e fargli leggere il mio che si chiama $paroleArray

e poi sostituire il tuo print_r() con il mio echo e cioè $errore .=...


PHP:
function detectBadWords($stringa, array $badWords) {
$stringa = $_POST['nome'].' '.$citta.' '.$messaggio;
$detected = array();
foreach ($badWords as $badWord) {
if (preg_match("/\b{$badWord}/i", $stringa, $matches)) {
$detected[] = $matches[0];
}
}
return $detected;
}

print_r(detectBadWords($stringa, array('mel(a|e)', 'cas(a|e)')));
 

Discussioni simili