PHP и с чем его едят....

Firewall

Мой повелитель
Del, а если три знака после запятой епик фейл, а так да проще -)
 

PainKiller

Пастафарианец
Команда форуму
Супер Модератор
Все-равно форма для ввода циферок вернет строку, потому можно так.
PHP:
function replaceNow($v){
if($a=preg_match('/[,\.]/',$v)){
		return preg_replace('/[,\.]/','',$v);
	}
	else{
		return $v.'00';
	}
}
Да и вообще, работать будет и с числами. Только что даже проверил+)
 

Del

Member
Del, а если три знака после запятой епик фейл, а так да проще -)
+1 я тож сразу об этом подумал :)
почему фейл, будет число с десятыми, которые можно убрать/округлить и т.п. но этого не было в задании.

в таком же духе можно предположить, что числа могут быть написаны прописью. тогда точно полный "епик фейл".

вообще, какой вопрос, такой и ответ.
 

Del

Member
Все-равно форма для ввода циферок вернет строку, потому можно так.
PHP:
function replaceNow($v){
if($a=preg_match('/[,\.]/',$v)){
		return preg_replace('/[,\.]/','',$v);
	}
	else{
		return $v.'00';
	}
}
Да и вообще, работать будет и с числами. Только что даже проверил+)
У меня была мысль типа:
PHP:
function num($s) {
	if (preg_match("/[.,]/", $s) == 0)
		return $s."00";
	return str_replace(array(".",","), "", $s);
}
Но вообще задание странное.
 

PainKiller

Пастафарианец
Команда форуму
Супер Модератор
У меня была мысль типа:
PHP:
function num($s) {
	if (preg_match("/[.,]/", $s) == 0)
		return $s."00";
	return str_replace(array(".",","), "", $s);
}
Но вообще задание странное.
Точку желательно бы экранировать, ибо потом гадость всякая вылазит(без \ точка=любой символ) по идее в этом варианте оно будет хватать все-подряд. И вообще, в перловых регулярках она - самый мерзкий символ+)
 

Del

Member
Точку желательно бы экранировать, ибо потом гадость всякая вылазит(без \ точка=любой символ) по идее в этом варианте оно будет хватать все-подряд. И вообще, в перловых регулярках она - самый мерзкий символ+)
Насколько я помню, в данном случае спецсимволы не являются спецсимволами если идут в начале.

По мне такое написание функции неправильно по логике.

С виду похоже, что допустим есть суммы зарплат: 123 грн, 123,32 грн.
Нужно получить их же, но в копейках, типа: 12300 коп., 12332 коп.

Т.е. при использовании предложенного варианта, если ввести сумму 123.234 грн, то получим 123234 коп, вместо 12323,4 коп, что неправильно.

Поэтому я и отказался от этого варианта. Хотя кто его знает, что там имелось ввиду.
 

PainKiller

Пастафарианец
Команда форуму
Супер Модератор
Спецсимволы без экранировки они и в африке спецсимволы.
 

Del

Member
Спецсимволы без экранировки они и в африке спецсимволы.
Ну мы ж не в Африке...

Внутри символьного класса специальные значения символов, в основном, игнорируются. Особые случаи:
Чтобы добавить символ ^ в набор, его следует поместить туда не первым.
Чтобы добавить символ - в набор, его следует поместить туда первым или последним. Например:
шаблон DNS-имени, куда могут входить буквы, цифры, минус и точка-разделитель: [-0-9a-zA-Z.];
любой символ, кроме минуса и цифры: [^-0-9].
 

Cris

Member
такс, вот сейчас я проект в котором нужно реализовать систему прав доступа для модераторов
так вот и чтоб было проще я сделал небольшой класс для работы с правами доступа:
permissions.php
PHP:
<?php
class Permissions
{
	private $code_file;
	private $separator_character;
	private $permissions;
	private $permissions_code_array;
	private $permissions_array;
	public $error;
	public $error_description;
	function Permissions($code_file,$separator,$permissions)
	{
		$this->code_file=$code_file;
		$this->separator_character=$separator;
		$this->permissions=$permissions;
		$this->parse_code();		
		$this->parse_permissions();
	}
	private function set_error($code,$description)
	{
		$this->error=$code;
		$this->error_description=$description;
	}
	private function parse_code()
	{
		$code_array=file($this->code_file);
		if(!$code_array)
			$this->set_error(1,"Не возможно открыть файл с кодами прав доступа!");
		else
		{
			$this->set_error(0,"");
			foreach($code_array as $row)
			{
				$row=ltrim(rtrim($row));
				$space_row=strpos($row," ");
				if($space_row!=0)
					$this->permissions_code_array[ltrim(rtrim(strtolower(substr($row,$space_row+1))))]=ltrim(rtrim(strtolower(substr($row,0,$space_row))));
			}
		}
	}
	private function parse_permissions()
	{
		$array=explode($this->separator_character,$this->permissions);
		foreach($array as $code)
		{
			$this->permissions_array[$code]=1;
		}
		$this->set_error(0,"");
	}
	public function delete_permission($code)
	{
		$this->permissions_array[$code]=false;
		$this->set_error(0,"");
	}
	public function create_permission($code)
	{
		$this->permissions_array[$code]=true;
		$this->set_error(0,"");
	}
	public function parse_permissions_array()
	{
		$return_string="";
		$i=0;
		foreach($this->permissions_array as $code=>$param)
		{
			if($param) 
			{
				if($i!=0)$return_string.=$this->separator_character;
				$return_string.=$code;
				$i++;
			}
		}
		$this->set_error(0,"");
		return $return_string;
	}
	function __call($name_permission,$parameters)
	{
		$name_permission=strtolower($name_permission);
		$code=$this->permissions_code_array[$name_permission];
		if($this->permissions_array[$code]) return true; else return false;
	}
}
?>
permissions_code.txt
PHP:
0 CreateNewUser
1 EditMenu
2 EditTemplates
3 EditNews
4 EditLeftBlock
use_perm.php
PHP:
<?php
include permissions.php
$user_perm=new Permissions('permissions_code.txt',';','0;2;3');
echo $user_perm->parse_permissions_array()."<br>";
if($user_perm->CreateNeWUser())
{
	echo "Вы можете создавать новый пользователей<br>";
}
$user_perm->delete_permission(0);
if(!$user_perm->CREATENewUser())
{
	echo "Вы не имеете права создавать польльзователей<br>";
}
$user_perm->create_permission(4);
if($user_perm->editleftblock())
{
	echo "Вы можете редактировать левый блок<br>";
}
echo $user_perm->parse_permissions_array();
?>
Вывод use_perm.php
PHP:
0;2;3
Вы можете создавать новый пользователей
Вы не имеете права создавать польльзователей
Вы можете редактировать левый блок
2;3;4
небольшие пояснения:
-работает только в PHP 5 так как в PHP 4 не было реализовано __call для классов
-для работы нужен файл в котором записано код-название прав доступа (permissions_code.txt), .txt для примера, это в ваших инетерсах - безопасность :), в строке один пробел-разделитель
-и так есть у нас файл с code-name правами доступа, в конструктор нужно передать "файл с code-name", "символ разделения", "права текущего юзера - в кодах"
-чтобы узнать есть право name у текущего пользователя - $екземпляр_класса->name() - true=есть_право, false=нету_права
-чтобы удалить право c кодом code - $екземпляр_класса->delete_permission(code);
-добавить новое право - $екземпляр_класса->create_permission(code);
-возвратить список прав после изменений - $екземпляр_класса->parse_permissions_array();
-регист букв в названии права рли не играет
-ошибки - $екземпляр_класса->error и $екземпляр_класса->error_description
над длинной названий функций надо еще поработать :)
могу добавить чтобы проверка права была не $екземпляр_класса->name(), а просто $екземпляр_класса->name

если что не понятно спрашивайте :)

критика приветствуется!!!
 

dreamer

Member
такс, вот сейчас я проект в котором нужно реализовать систему прав доступа для модераторов
так вот и чтоб было проще я сделал небольшой класс для работы с правами доступа:
permissions.php
Много кода, мало смысла.
Чем тебе не угодил:
PHP:
class AccessManager {
  var $rules = array(
    create => 1,
    delete => 2,
    view   => 3,
    edit    => 4,
  );
  function __constructor($rights) {
    $this->rights = explode(';', $rights);
  }
  function can($do) {
    return in_array($this->rules[$do], $this->right);
  }
}
assert(new AccessManager("1;3")->can("view"));
Какой смысл хранить имена в файле? Большая часть кода занимается именно парсингом файла.
 
Зверху