2014-04-24 4 views
0

J'utilise preg_match_all pour construire le tableau pour shortcodes et il fonctionne très bien, mais il renvoie aussi des tableaux avec des valeurs vides voir ici s'il vous plaîtComment effacer preg_match_all du tableau vide valeurs

https://eval.in/141437

En utilisant ce match sorcière je suis sûr est de casey les tableaux vides supplémentaires

#\[link(.*?)link\=\"(.*?)\"(.*?)text\=\"(.*?)\"\]#e 

Comment puis-je les effacer. J'ai essayé array_filter mais cela n'a pas fonctionné.

Merci!

Répondre

1

() représente un groupe de capture et sera représenté dans le tableau $matches même s'il est vide.

Ou se débarrasser des () autour des groupes qui reviennent vides comme (.*?) pour le rendre juste .*? (parce que probablement vous ne voulez pas les frais) ou indiquer au moteur de ne pas capturer qu'avec (?: comme (?:.*?).

#\[link.*?link\=\"(.*?)\".*?text\=\"(.*?)\"\]#e 

Ou si vous ne voulez ceux qui sont renvoyés quand ils ne sont pas vides, puis utilisez + au lieu de *:

#\[link(.+?)link\=\"(.*?)\"(.+?)text\=\"(.*?)\"\]#e 
+0

A cloué! Les deux options fonctionnent. Je vous remercie. Doit attendre quelques minutes pour accepter. – Benn

+0

OK, édité à droite comme vous avez accepté d'inclure si vous vouliez ces groupes quand ils ne sont pas vides. – AbraCadaver

+0

Merci encore. Ce que j'essaie de dire avec cette expression est, capturer la chaîne à l'intérieur "" et ne faites pas attention à ce qui est entre les balises comme le lien --- RIEN - texte. Votre explication a maintenant du sens puisque j'utilisais() et capturais tout – Benn

0

La fonction array_filter() devrait fonctionner si vous l'utilisez comme ceci:

$matches = array_filter($matches, function($item) { return trim($item[0]) && true; }); 

La réponse d'AbraCadaver est la meilleure solution.