2010-07-20 9 views
0

Lorsque j'effectue une expression régulièreNegotiate tableaux dans un tableau

preg_match_all('~(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)~', $content, $turls); 
print_r($turls); 

je suis un tableau à l'intérieur de tableau. J'ai besoin d'un seul tableau seulement.

Comment négocier les tableaux dans un autre tableaux

+0

Que votre 'print_r (turls $)' imprimer? – BoltClock

+0

$ content est en fait file_get_contents ("http://www.yahoo.com"); et donc preg_match_all extrait les liens de yahoo.com et il est stocké dans le tableau $ turls – Rajasekar

Répondre

0

Par preg_match_all par défaut() utilise PREG_PATTERN_ORDER drapeau, ce qui signifie:

Ordres résultats de sorte que $ matches [0] est un tableau complet de modèle correspond, $ correspond 1 est un tableau de chaînes apparié par le premier sous-masque entre parenthèses, et ainsi de suite.

Voir http://php.net/preg_match_all

Voici un exemple de sortie:

array(
    0 => array(// Full pattern matches 
     0 => 'http://www.w3.org/TR/html4/strict.dtd', 
     1 => ... 
    ), 

    1 => array(// First parenthesized subpattern. 
       // In your case it is the same as full pattern, because first 
       // parenthesized subpattern includes all pattern :-) 
     0 => 'http://www.w3.org/TR/html4/strict.dtd', 
     1 => ... 
    ), 

    2 => array(// Second parenthesized subpattern. 
     0 => 'www.w3.org', 
     1 => ... 
    ), 
    ... 
) 

Alors, comme R. Hill a répondu, vous avez besoin $ matches [0] pour accéder à toutes les urls correspondants. Et comme budinov.com pointu, vous devez supprimer entre parenthèses externes pour éviter deuxième match en double première, .: par exemple

preg_match_all('~https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?~', $content, $turls); 
// where $turls[0] is what you need 
0

Je ne sais pas ce que vous entendez par « negociate ». Si vous voulez dire chercher le tableau intérieur, qui devrait fonctionner:

$urls = preg_match_all('~(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)~', $content, $matches) ? $matches[0] : array(); 
if (count($urls)) { 
    ... 
    } 
0

En général, vous pouvez remplacer votre regexp avec celui qui ne contient pas entre parenthèses(). De cette façon, vos résultats seront tenir juste au $ turls [0] variable:

preg_match_all('/https?\:\/\/[^\"\'\s]+/i', file_get_contents('http://www.yahoo.com'), $turls); 

puis faire un peu de code pour urls unique comme ceci:

$result = array_keys(array_flip($turls[0])); 
Questions connexes