Нужда от лека корекция на regex

hrischo

Registered
Такааа, ще карам по същество. Имам следния код :

preg_match('/^([a-zA-Z0-9\_\[\]\+\-\^]+)\_(.*)\_([0-9]{4}).([0-9]{2})/', $name, $matches);

Обикновенно нещата, които минават през него са следните:

mapname_author_time
cad_miniclimb_NAME_0050.03
kz_cg_extreme_NAME_1116.48


До тук всичко е добре, но проблема идва, когато и в двете : name и author се появят знаците " _ " и " ^ "
Пример :

rr_inside^outside_NAME^_^_0049.54 - тук трябва да бъде разделено така : [1] => rr_inside^outside, [2] => NAME^_^, [3] и [4] времето( за него няма проблем), но то го разделя : 1 => rr_inside^outside_NAME^, 2 => _^

или пример с " _ ":
cypress_rockclimb_NAME^_^_0415.58.rar - [1] => cypress_rockclimb, [2] => NAME^_^ . Тук също се прецаква: [1] = > cypress_rockclimb_NAME^

И в двата случа нещата не вървят добре. Нуждая се от лека корекция на нещата.
 
Няма значение как ги получавам, не е в това проблема. Иначе от - multipart/form-data ги получавам, тоест качват ги.
 
Малко сложно е това за моята логика :D, но ще се опитам да помогна. :)

Значи ако сам разбрал добре би трябвало така да работи:
PHP:
preg_match('/^(.*)\_(.*)\_([0-9]{4}).([0-9]{2})/', $name, $matches);
:idea:
 
Преди да се сформират 3те в един стринг, направи всеки $_POST да минава през preg_replace.

$mapname = preg_replace('/^([^a-zA-Z0-9а-зА-З]+)$/', '', $_POST['mapname']);
$author = preg_replace('/^([^a-zA-Z0-9а-зА-З]+)$/', '', $_POST['author']);
$time = preg_replace('/^([^a-zA-Z0-9а-зА-З]+)$/', '', $_POST['time']);

// Кода за сформиране на 3те в едно и после твоя preg_match.
 
Ev0luti0N каза:
Малко сложно е това за моята логика :D, но ще се опитам да помогна. :)

Значи ако сам разбрал добре би трябвало така да работи:
PHP:
preg_match('/^(.*)\_(.*)\_([0-9]{4}).([0-9]{2})/', $name, $matches);
:idea:

Не ми върши работа, за съжаление.

alex3 каза:
Преди да се сформират 3те в един стринг, направи всеки $_POST да минава през preg_replace.

$mapname = preg_replace('/^([^a-zA-Z0-9а-зА-З]+)$/', '', $_POST['mapname']);
$author = preg_replace('/^([^a-zA-Z0-9а-зА-З]+)$/', '', $_POST['author']);
$time = preg_replace('/^([^a-zA-Z0-9а-зА-З]+)$/', '', $_POST['time']);

// Кода за сформиране на 3те в едно и после твоя preg_match.

Tе не се сформират, потребителите директно ги качват :

name_author_time.rar
 
<?php
$name = "rr_inside^outside_NAME^_^_0049.54";
$name = str_replace("^_^_", "/__", $name);
$reg = "/^([a-zA-Z0-9\_\[\]\+\-\^]+)\_(.*)/";
$reg2 = "/^([a-zA-Z0-9\_\[\]\+\-\^]+)([0-9]{4}).([0-9]{2})/";
preg_match($reg, $name, $matches);
$matches[2] = str_replace("/__", "^_^_", $matches[2]);
preg_match($reg2, $matches[2], $matchess);
$result = array($matches[1],$matchess[1],$matchess[2],$matchess[3]);
echo "<pre>";
print_r($result);
echo "</pre>";

?>

Това което измислих
 
Манипулацията ми трябва в regex-a. Иначе в момента имам 1 вариант, който е за да закърпи положението, но искам да се отърва от него възможно най-скоро.
 
Ето го решението на проблема :

preg_match('/^([a-zA-Z0-9\_\[\]\+\-\^]+)\_(.{2,})\_([0-9]{4}).([0-9]{2})/', $name, $matches);

Вместо (.*) вече използвам : (.{2,}), което върши идеална работа. Благодаря все пак на отзовалите се.

macmen получава точката.
 

Back
Горе