Я пытаюсь построить регулярное выражение в 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 для целей отладки)