2012-01-04 2 views
0

J'ai juste un motif de test ici, mais il n'interdit pas les espaces.preg_match ne fonctionne pas avec mon tableau

$myarray[]='s s'; 
if (preg_match('/[^\d\w\(\)\[\]\.\-]+/',$myarray)>0) echo 'yes'; 

Cela ne fait rien, mais

$test='s s'; 
if (preg_match('/[^\d\w\(\)\[\]\.\-]+/',$test)>0) echo 'yes'; 

Cela fonctionne très bien ... Je ne comprends pas pourquoi il ne fonctionne pas avec mon tableau?

+1

Si vous regardez les (http://php.net/manual/en/function.preg-match.php) [docs] Vous verrez que la fonction accepte seulement une chaîne comme sujet donc ce n'est pas étrange du tout ça ne fonctionne pas: P – PeeHaa

+0

preg-match ne fonctionne pas avec les tableaux –

Répondre

1

preg_match n'accepte pas un tableau en entrée, une seule chaîne. Vous auriez besoin de faire quelque chose comme ...

$matched = no; 
foreach($myarray as $x) { 
    if (preg_match('/[^\d\w\(\)\[\]\.\-]+/',$x)>0) $matched = true; 
} 
if($matched) echo 'yes'; 

Pour le faire en une seule étape:

function preg_match_any($regex,$array) { 
    foreach($array as $x) { 
     if (preg_match($regex,$x)>0) return true; 
    } 
    return false; 
} 

//Then to call it just something like: 
if (preg_match_any('/[^\d\w\(\)\[\]\.\-]+/',$myarray)) echo 'yes'; 
+0

Oh, merci, j'ai compris, je pense que je m'en tiendrai à celle-ci si elle ne peut pas être faite en un seul appel. Merci! :) – Anonymous

+0

Vous pourriez facilement créer une fonction simple qui fait cela pour vous - je mettrai à jour ma réponse ... – SpoonNZ

+0

Eh bien, merci de m'avoir fait remarquer, je finis par faire la fonction moi-même, je ne pensais pas que vous éditiez votre message: P voici ce que j'ai: function u ($ in) {foreach ($ in as $ x => $ a) { if (preg_match ('/ [^ \ d \ w \ (\) \ [\] \. \ -] + /', $ a)> 0) return (true);}}; if (u ($ input)) echo 'oui'; – Anonymous

2

Vous ne pouvez pas effectuer une opération comme celle d'une matrice. Comme vous pouvez le voir dans the documentation on preg_match(), il prend une chaîne comme deuxième paramètre, pas un tableau.

int preg_match (string $pattern , string $subject 
     [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]]) 

Au lieu de cela, vous devez dire ce que l'élément que vous voulez faire l'opération sur.

Si vous voulez faire cela à un seul élément d'un tableau, utilisez simplement son index. Par exemple. le premier élément sera $myarray[0], de sorte que les éléments suivants devraient fonctionner:

if (preg_match('/[^\d\w\(\)\[\]\.\-]+/',$myarray[0])>0) echo 'yes'; 

Si vous d'autre part souhaitent le faire à chaque élément dans votre tableau, vous pouvez

  • créer un boucle foreach

    foreach ($myarray as $element) { 
        if (preg_match('/[^\d\w\(\)\[\]\.\-]+/',$element)>0) echo 'yes'; 
    } 
    
  • array_map() d'utilisation et une ca Fonction llback

    function match_callback($element) { 
        if (preg_match('/[^\d\w\(\)\[\]\.\-]+/',$element)>0) echo 'yes'; 
    } 
    array_map('match_callback',$myarray); 
    
+0

merci, eh bien, je voulais juste obtenir un seul oui, si l'un des éléments du tableau correspond à un motif. – Anonymous

+0

@ user1125062 Si c'est le cas, utilisez simplement la boucle 'foreach'. N'oubliez pas d'appeler 'break' si une correspondance est trouvée, sinon la boucle traversera le reste du tableau après une correspondance et écrira peut-être plusieurs fois 'oui'. – kba

0

Vous ne pouvez pas utiliser un tableau comme sujet que preg_match accepte uniquement une chaîne. Vous pouvez utiliser une fonction anonyme (php 5.3+):

$ret = array_map(function($element) {  
    return preg_replace('/[^\d\w\(\)\[\]\.\-]+/', '', $element) > 0; 
}, $myarray);