php объединение регулярных выражений нежелательных обратных косых черт - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь построить регулярное выражение в php. Я протестировал его здесь https://regex101.com/, и он отлично работает, но это было до того, как я понял, что мне придется реализовать его в php, и он добавляет обратную косую черту там, где это не нужно.

Вот мой код:

$datePattern        = "\[((19|20)\d\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])\]";
$tag                = "[a-z]+(?:-[a-z]+)*";
$regroupmentPattern = "\[($tag)?\]";
$taglistPattern     = "\[((?:$tag)?(?:;(?:$tag))*)\]";
$countryPattern     = "\[([a-z]{2})\]";
$freePattern        = "\[([^\[\]]*)\]";
$extensionPattern   = "\.(jpg|png)";
$repetitionPattern  = "(?:\(\d+\))?";

$fullPattern        = "/^$datePattern$regroupmentPattern$taglistPattern$countryPattern$freePattern$freePattern$extensionPattern$repetitionPattern$/";

Вот что я хочу:

^\[((19|20)\d\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])\]\[([a-z]+(?:-[a-z]+)*)?\]\[((?:[a-z]+(?:-[a-z]+)*)?(?:;(?:[a-z]+(?:-[a-z]+)*))*)\]\[([a-z]{2})\]\[([^\[\]]*)\]\[([^\[\]]*)\](?:\(\d+\))?\.(jpg|png)$

И вот что я получаю:

"\"\\/^\\\\[((19|20)\\\\d\\\\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])\\\\]\\\\[([a-z]+(?:-[a-z]+)*)?\\\\]\\\\[((?:[a-z]+(?:-[a-z]+)*)?(?:;(?:[a-z]+(?:-[a-z]+)*))*)\\\\]\\\\[([a-z]{2})\\\\]\\\\[([^\\\\[\\\\]]*)\\\\]\\\\[([^\\\\[\\\\]]*)\\\\]\\\\.(jpg|png)(?:\\\\(\\\\d+\\\\))?$\\/\""

Я предполагаю, что должно быть какое-то escape-функция, я попробовал preg_quote, но она добавила еще больше обратной косой черты.

Кстати, вот мой полный код:

<?php
  class Gallery {
    // Name of the gallery, used to build folder path
    private $name;

    function __construct($name) {
      $this->name = $name;
    }

    /*
     * Returns the list of file names in a gallery folder,
     * or false if the folder doesn't exist
     */
      public function getFileNames() {
        $path = "../../gallery/$this->name";
        if (is_dir($path)) {
          $allFileNamesArray = scandir($path, SCANDIR_SORT_ASCENDING);
          $filteredFileNamesArray = array();

          // Building regular expression
          $datePattern        = "\[((19|20)\d\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])\]";
          $tag                = "[a-z]+(?:-[a-z]+)*";
          $regroupmentPattern = "\[($tag)?\]";
          $taglistPattern     = "\[((?:$tag)?(?:;(?:$tag))*)\]";
          $countryPattern     = "\[([a-z]{2})\]";
          $freePattern        = "\[([^\[\]]*)\]";
          $extensionPattern   = "\.(jpg|png)";
          $repetitionPattern  = "(?:\(\d+\))?";

          $fullPattern        = "/^$datePattern$regroupmentPattern$taglistPattern$countryPattern$freePattern$freePattern$extensionPattern$repetitionPattern$/";

          foreach ($allFileNamesArray as $fileName) {
            $matches = array();
            if (preg_match($fullPattern, $fileName, $matches, PREG_UNMATCHED_AS_NULL)) {
              $filteredFileNamesArray[] = $fileName;
            }
            var_dump($matches);
          }

          return json_encode($fullPattern);
        }
        else {
          return false;
        }
      }
  }
?>

(Здесь я вернул fullPattern istead от FilterFileNamesArray для целей отладки)

1 Ответ

1 голос
/ 24 апреля 2020

Вы поменялись местами $repetitionPattern и $extensionPattern.

Использование

$fullPattern = "/^$datePattern$regroupmentPattern$taglistPattern$countryPattern$freePattern$freePattern$repetitionPattern$extensionPattern$/";

Это приведет к шаблону

^\[((19|20)\d\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])\]\[([a-z]+(?:-[a-z]+)*)?\]\[((?:[a-z]+(?:-[a-z]+)*)?(?:;(?:[a-z]+(?:-[a-z]+)*))*)\]\[([a-z]{2})\]\[([^\[\]]*)\]\[([^\[\]]*)\](?:\(\d+\))?\.(jpg|png)$.

См. regex demo online .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...