1
votes

Modèle de filtrage des fichiers avec plusieurs extensions combinées

Comment construire une regex pour correspondre à

$regexIterator = new RegexIterator(
    new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)),
    /(?!\..*)\.html$/
);
$files = (iterator_to_array($regexIterator));

mais pas

qwerty.php.html

ou à toute extension combinée. J'ai "créé" ceci: "/(?!\..*)\.html$/" qui renvoie 0. Comment le faire fonctionner?

C'est le code que j'ai:

qwerty.html


0 commentaires

3 Réponses :


0
votes

Le modèle (?! \ .. *) \. html $ correspond à .html à la fin de la chaîne uniquement s'il n'y a pas de . immédiatement à droite de l'emplacement actuel (l'attaque négative (?! \ .. *) applique cette restriction). Remarquez . * à la fin du modèle d'anticipation ne fait aucune différence. Comme \. dans \ .html exige qu'un point soit juste là où (?! \ .. *) l'interdit, le motif sera ne correspond à aucune chaîne.

Vous pouvez utiliser

'~^[^.]*\.html$~'

Voir le démo regex

  • ^ - début de chaîne
  • [^.] * - une classe de caractères annulée correspondant à plus de 0 caractères autres que .
  • \ .html - une sous-chaîne .html
  • $ - fin de chaîne.


0 commentaires

0
votes

Utilisez l'expression régulière suivante

^([^.]*)\.[^.]*$

Elle correspond aux chaînes qui ne contiennent qu'un seul point - exemple ici - explication

  • [^.] * correspond à n'importe quel caractère sauf le point

Pour la correspondance uniquement les fichiers html, utilisez ^([^. *)\.html*$


5 commentaires

FYI 1) {1} est redondant et mieux est supprimé. 2) [^.] * correspondra à n'importe quelle extension, OP doit correspondre à html .


J'ai fait une mise à jour, avec le code que j'ai. Cela a renvoyé tous les fichiers, y compris * .php :(


@Bakudan pour les fichiers html, utilisez uniquement ^ ([^.] *) \. Html * $


@ KamilKiełczewski oui, c'était ce que je voulais réaliser. Pourriez-vous s'il vous plaît l'ajouter à la réponse.


@Bakudan je l'ajoute en bas



0
votes

Votre regex ne fonctionne pas parce que vous dites que les caractères suivants ne devraient pas inclure de point (c'est-à-dire (?! \ .. *) ) mais immédiatement vous dites qu'ils devraient (ie .html ).

La seule solution acceptable est la suivante:

\.\w+\.html$(*SKIP)(*F)|\.html$

Regex démo en direct

Répartition des expressions régulières:

  • \. \ w + \. html $ Correspond à un fichier .html qui a un nom d'extension précédent
  • (* SKIP) (* F) Jetez-le
  • | Ou
  • \ .html $ Correspond à un fichier .html qui n’a pas d’extension précédente

Cela n'autorise pas . {alphanum + _}. html comme:

  • .php.html
  • .mp4.html
  • .j_p_g.html

Mais ne gâche pas avec différents noms de fichiers en même temps et permet des modèles comme ci-dessous:

  • a.fichier.nom@user.html


0 commentaires