PDA

View Full Version : چگونگی گرفتن آیدی بخشی خاص در یک کد php



ms11309
دوشنبه 26 خرداد 1393, 15:57 عصر
سلام چطور باید دستوری رو از تگ html به php فرستاد یا به عبارت دیگر این دستور رو توسط php دریافت کرد و خوند؟؟ مثلا در بلاگفا این کد رو ببینید


<BlogPostBlock id=1>

با قرار دادن این کد در قالب وبلاگ عدد 1 پایانی به php فرستاده میشه و در اون بخش فقط یک مطلب نمایش داده میشه حالا با تغییر


<BlogPostBlock id=5>

در اون بخش 5 تا مطلب نمایش داده میشه یعنی دستور در php دریافت میشه چطور اتفاق میفته؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

ms11309
دوشنبه 26 خرداد 1393, 16:12 عصر
کسی نمیدونه چطور انجام میشه؟؟؟؟؟؟؟؟؟؟

ravand
دوشنبه 26 خرداد 1393, 22:29 عصر
من سرویس های دیگه ی وبلاگی رو که دیدم معمولا توی خود سیستم مدیریت محتواش اینو تعیین میکنن. به نظرم هم اینطوری اصولی تره تا اینکه توی کدها اینو تعیین کنی.

ms11309
دوشنبه 26 خرداد 1393, 22:43 عصر
من سرویس های دیگه ی وبلاگی رو که دیدم معمولا توی خود سیستم مدیریت محتواش اینو تعیین میکنن. به نظرم هم اینطوری اصولی تره تا اینکه توی کدها اینو تعیین کنی.

ممنون از پاسختون ولی من نیاز شدید به این روش دارم!!!
لطفا یکی کمک کنه

prans.info
سه شنبه 27 خرداد 1393, 08:17 صبح
معمولا از این فانکشن ها استفاده می کنند :



function before($this, $inthat) {

return substr($inthat, 0, strpos($inthat, $this));
}
function after($this, $inthat) {
if(!is_bool(strpos($inthat, $this))) {
return substr($inthat, strpos($inthat,$this)+strlen($this));
}else{
return false;
}
}


function vasat ($this, $that, $inthat) {
return before($that, after($this, $inthat));
}


$code = '<BlogPostBlock id=5>';
$id = vasat ('<BlogPostBlock id=' , '>',$code);
echo $id; // = 5 ! :)

ms11309
سه شنبه 27 خرداد 1393, 19:11 عصر
معمولا از این فانکشن ها استفاده می کنند :



function before($this, $inthat) {

return substr($inthat, 0, strpos($inthat, $this));
}
function after($this, $inthat) {
if(!is_bool(strpos($inthat, $this))) {
return substr($inthat, strpos($inthat,$this)+strlen($this));
}else{
return false;
}
}


function vasat ($this, $that, $inthat) {
return before($that, after($this, $inthat));
}


$code = '<BlogPostBlock id=5>';
$id = vasat ('<BlogPostBlock id=' , '>',$code);
echo $id; // = 5 ! :)


ممنون بابت راهنمایی
ولی اگه ممکنه یکم کد رو توضیح بدید

ms11309
سه شنبه 27 خرداد 1393, 19:23 عصر
راهی دیگه ای نیست برای این کار
به دلایل نا معلومی این کد بین کد های دیگه کار نمیکنه
وای به تنهایی به درستی کار میکنه

ms11309
سه شنبه 27 خرداد 1393, 19:43 عصر
دوستان لطفا کمک هاتون رو دریغ نکنید

ms11309
سه شنبه 27 خرداد 1393, 20:11 عصر
امیدی نیست ؟؟؟؟؟؟

aalmair
سه شنبه 27 خرداد 1393, 21:42 عصر
من کدی دارم که برای سیستم وبلاگ دهی خودم ساختم اما خیلی زیاده . اگه خواستی پیغام بده
وبلاگ من (http://arash.aalma.ir)

leaping
سه شنبه 27 خرداد 1393, 22:45 عصر
دوست عزیز کافیه که کد قالبتون رو در قالب یک رشته بخونید و مقدار id رو استخراج کنید و به عنوان یک متغییر ازش استفاده کنید.

prans.info
سه شنبه 27 خرداد 1393, 22:54 عصر
اگه فانکشنی با همین اسم ها وجود نداشته باشه (فانکشن چند بار تعریف نشده باشه ...) نباید مشکلی پیش بیاد . (اون قسمت از اسکریپت رو که کد رو قرار میدید مشکل پیدا می کنه رو برام بفرستید تا چک کنم)
این کد بسیار ساده هست و ترکیبی از substr (برای بریدن بخش مشخصی از رشته) و strpos (برای پیدا کردن متن خاصی در رشته) و strlen (شمردن تعداد کاراکتر رشته) و کلا الگوریتم بسیار ساده ای داره که با توضیحات من فکر کنم دیگه متوجه شده باشید و نیاز به توضیح دیگه ای نباشه ...

MMSHFE
چهارشنبه 28 خرداد 1393, 12:35 عصر
بطور کلی اینجور کارها رو با RegExp و یا همین توابع ساده رشته ای میشه به راحتی انجام داد. البته سرویسهای وبلاگدهی از موتورهای قالب استفاده میکنن یا خودشون یکی برای کار خودشون طراحی میکنن.

ms11309
چهارشنبه 28 خرداد 1393, 16:03 عصر
دوست عزیز کافیه که کد قالبتون رو در قالب یک رشته بخونید و مقدار id رو استخراج کنید و به عنوان یک متغییر ازش استفاده کنید.

ممنون از توضیحاتتون
نمونه کدی میتونید قرار بدید؟



اگه فانکشنی با همین اسم ها وجود نداشته باشه (فانکشن چند بار تعریف نشده باشه ...) نباید مشکلی پیش بیاد . (اون قسمت از اسکریپت رو که کد رو قرار میدید مشکل پیدا می کنه رو برام بفرستید تا چک کنم)
این کد بسیار ساده هست و ترکیبی از substr (برای بریدن بخش مشخصی از رشته) و strpos (برای پیدا کردن متن خاصی در رشته) و strlen (شمردن تعداد کاراکتر رشته) و کلا الگوریتم بسیار ساده ای داره که با توضیحات من فکر کنم دیگه متوجه شده باشید و نیاز به توضیح دیگه ای نباشه ...

ممنون از توضیحاتتون
مشکل اینجاست که قراره این عمل چندین بار تکرار بشه
و با تکرار کد دیگه کارایی نداره
بازم ممنون



بطور کلی اینجور کارها رو با RegExp و یا همین توابع ساده رشته ای میشه به راحتی انجام داد. البته سرویسهای وبلاگدهی از موتورهای قالب استفاده میکنن یا خودشون یکی برای کار خودشون طراحی میکنن.

تشکر از راهنماییتون
از اینی که گفتید اصلا سررشته ای ندارم
لطفا با یک مثال یا نمونه بیشتر راهنماییم کنید

aalmair
چهارشنبه 28 خرداد 1393, 17:27 عصر
کدی که خواسته بودین رو قرار دادم
تذکر : برای اینکه با دستورات html ترکیب نشه تگ های که می خواهید استفاده کنید رو در آرایه all_box_list در خطوط اول قرار بدید (از حروف ، اعداد ، زیر خط و خط تیره در زبان انگلیسی استفاده کنید)

تذکر 2: این کدی رو که گذاشتم کامل نیست و قرار نیست اون ها رو پردازش کنه و ممکن که هیچ خطایی نداشته باشد و فقط دستورات شما رو با غیر دستورات جدا می کند








class blog_template_parse{


private $starting_tag_char='<';
private $endding_tag_char='>';



private $all_box_list=array(
"BlogPostBlock"
);




public function __construct(){










}

private function check_tag_exist($tagname=''){


if(in_array($tagname,$this->all_box_list)){
return 1;
}
return 0;

}
private function starting_character($chars=''){

for($i=0,$s=strlen($chars);$i<$s;$i++){
if(!(ctype_alnum($chars[$i])||$chars[$i]=='_'||$chars[$i]=='='||$chars[$i]=='#')){
return 0;
}
}
return 1;
}
private function cmd_character($chars=''){
$flag=0;
if(!($s=strlen($chars))){
return 0;
}
for($i=0;$i<$s;$i++){
if(!(ctype_alnum($chars[$i])||$chars[$i]=='_'||$chars[$i]=='-')){
return 0;
}
}
return 1;
}
private function variable_protocol($chars=''){
if($s=strlen($chars)){
if(ctype_alpha($chars[0])||$chars[0]=='_')
{

for($i=1;$i<$s;$i++){
if(!(ctype_alnum($chars[$i])||$chars[$i]=='_')){
return 0;
}
}
return 1;
}
}
return 0;
}
private function strip_space($str='',$size=0,$i=0,&$line_count=0){
$line_count=0;
while($i<$size&&ord($str[$i])<=32)
{
if(ord($str[$i])==10)
{
$line_count++;
}
$i++;
}
return $i;
}
private function attribute_parse($i=0,&$line_counter=0,&$res_attribute=array()){

$line_counter=0 ;
$str=$this->source_str;
$size=$this->source_str_size;

if(!(ord($str[$i])<=32||$str[$i]==$this->endding_tag_char)){
return $i;
}



$temp_line_counter=0;
$front_attribute_index=$i;

$attributes=array();
$i=$this->strip_space($str,$size,$i,$temp_line_counter);
$line_counter+=$temp_line_counter;


while($i<$size){

if($str[$i]==$this->starting_tag_char){

$res_attribute=$attributes;
return $i;
break;
}elseif($str[$i]=='='&&ord($str[$i])>32){
$attribute_name='';
$e=$i-1;
while($e>=0){
if($e==$front_attribute_index) {
$e++;
break;
}
elseif(ord($str[$e])<=32){
$e++;
if(ord($str[$e])==10)
{
$line_counter++;
}
break;
}
$e--;

}


$i++;



$attribute_name=substr($str,$e,$i-$e-1);





if(!trim($attribute_name)){continue;}

$attribute_value='';
$i=$this->strip_space($str,$size,$i,$temp_line_counter);
$line_counter+=$temp_line_counter;

if($str[$i]=="'"){
$i++;
while($i<$size){
if($str[$i]=="'")
{
$front_attribute_index=$i;
break;
}
else
{
if(ord($str[$i])==10)
{
$line_counter++;
}
$attribute_value.=$str[$i];
}

$i++;
}
}elseif($str[$i]=='"'){
$i++;
while($i<$size){
if($str[$i]=='"'){
$front_attribute_index=$i;
break;

}else
{
if(ord($str[$i])==10)
{
$line_counter++;
}
$attribute_value.=$str[$i];
}

$i++;
}
}else{
while($i<$size){
if(ord($str[$i])<=32) {
if(!isset($attributes[strtolower($attribute_name)])){
$attributes[strtolower($attribute_name)]=$attribute_value;

}
if(ord($str[$i])==10)
{
$line_counter++;
}
$front_attribute_index=$i;
break;
}elseif($str[$i]==$this->endding_tag_char){
if(!isset($attributes[strtolower($attribute_name)])){
$attributes[strtolower($attribute_name)]=$attribute_value;

}

$res_attribute=$attributes;
return $i;
}
$attribute_value.=$str[$i];
$i++;
}
}

if(!isset($attributes[strtolower($attribute_name)])){
$attributes[strtolower($attribute_name)]=$attribute_value;

}


}

$i++;
}

return $i;

}
public function literally_parse($source='',&$str_res='',&$error_str=''){

$error_str='';
$str=$this->source_str=$source;
$size=$this->source_str_size=strlen($source);
$res=array();
$stack=array();
$temp_str='';
$col=0;
$row=1;
$arr_loop_continue_stack=array();
$i=0;
$temp_line_counter=0;

while($i<$size){


if($i+1<$size && $str[$i]==$this->starting_tag_char && $this->starting_character($str[$i+1])){

if(strlen($temp_str)){
$res[]=array('t'=>'text','v'=>$temp_str);
$temp_str='';
}


$succes_box='';


$data_list=array();




$start_element=$i;
$endding_element_index=0;
$i++;
$temp_cmd_name='';
$end_element=0;
// $equal_sign=0;
// $var_exist=0;
// $block_or_loop_exist=0;
// $var_list=array();
// $block_content_error=0;
$cmd_parameter=array();
$cmd_parameter=array();
// $special_block=0;
$data_exist=0;
$char_is_space=0;
$char_is_colon=0;
$char_is_dot=0;


while($i<$size){

//if(!$this->starting_character($str[$i])){
// break;
// }




if(ord($str[$i])<=32||$str[$i]==$this->endding_tag_char)
{

if(ord($str[$i])<=32){
$char_is_space=1;
}


if(!$data_exist)
{


if(strlen($temp_cmd_name))
{



if($this->check_tag_exist($temp_cmd_name))
{





$succes_box=strtolower($temp_cmd_name);


if($char_is_space)
{
$i=$this->attribute_parse($i,$temp_line_counter,$attribute_r es);
$row+=$temp_line_counter;
$cmd_parameter=$attribute_res;
}


}
else
{
break;
}

}else{
if($char_is_space)
{
$i=$this->attribute_parse($i,$temp_line_counter,$attribute_r es);
$row+=$temp_line_counter;
$cmd_parameter=$attribute_res;
}

}
}else
{
if(strlen($temp_cmd_name))
{


$data_list[]=strtolower($temp_cmd_name);



if($char_is_space)
{
$i=$this->attribute_parse($i,$temp_line_counter,$attribute_r es);
$row+=$temp_line_counter;
$cmd_parameter=$attribute_res;
}
}
else
{

break;
}
}







if($i<$size&&$str[$i]==$this->endding_tag_char )
{
$end_element=1;
$endding_element_index=$i;
break;

}else{
break;
}

}
elseif($i<$size){
if(!$this->cmd_character($str[$i])){
break;
}
$temp_cmd_name.=$str[$i];
}



$i++;
}//end while


// var_dump('start box',$succes_box);exit;
// exit;




if($end_element)
{


if(strlen($succes_box))
{ //parsing block








if(empty($cmd_parameter))
{

$res[]=array('t'=>'start','v'=>$succes_box);
}else
{
$res[]=array('t'=>'start','v'=>($succes_box),'p'=>$cmd_parameter);
}
$stack=$succes_box;







//$temp_str.=substr($str,$start_element,$i-$start_element+1);




}else
{
$temp_str.=substr($str,$start_element,$i-$start_element+1);
}



}
else{
//error in syntax
/*
if(@$str[$i]==$this->starting_tag_char){ //starting new tag
$temp_str.=substr($str,$start_element,$i-$start_element);
continue;

}else
*/
{
// var_dump('else');
$temp_str.=substr($str,$start_element,$i-$start_element+1);
}

}



}
elseif($i+2<$size&&$str[$i]==$this->starting_tag_char&&$str[$i+1]=='/'&&$this->starting_character($str[$i+2])){


$start_element=$i;

$i+=2;
if(strlen($temp_str)){
$res[]=array('t'=>'text','v'=>$temp_str);
$temp_str='';
}


$succes_box='';








$endding_element_index=0;

$temp_cmd_name='';
$end_element=0;
$char_is_space=0;
$char_is_colon=0;
$char_is_dot=0;

while($i<$size){

//if(!$this->starting_character($str[$i])){
// break;
// }




if(ord($str[$i])<=32||$str[$i]==$this->endding_tag_char)
{

if(ord($str[$i])<=32){
$char_is_space=1;
}






if(strlen($temp_cmd_name))
{
if($this->check_tag_exist($temp_cmd_name))
{





$succes_box=strtolower($temp_cmd_name);


if($char_is_space)
{
$i=$this->attribute_parse($i,$temp_line_counter,$attribute_r es);
$row+=$temp_line_counter;
$cmd_parameter=$attribute_res;
}


}
else
{
break;
}

}else{
if($char_is_space)
{
$i=$this->attribute_parse($i,$temp_line_counter,$attribute_r es);
$row+=$temp_line_counter;
$cmd_parameter=$attribute_res;
}

}








if($i<$size&&$str[$i]==$this->endding_tag_char )
{
$end_element=1;
$endding_element_index=$i;
break;

}else{
break;
}

}
elseif($i<$size){
if(!$this->cmd_character($str[$i])){
break;
}
$temp_cmd_name.=$str[$i];
}



$i++;
}//end while



if($end_element&&strlen($succes_box))
{




if(empty($stack))
{

$temp_str.=substr($str,$start_element,$i-$start_element+1);

break;
//$error=('synatx error : endding tag without staring tag.') ; return 0;
}


/*
$pop=array_pop($stack);
if($pop!=$succes_box){

$implode_start=implode(':',$pop);
$implode_end=implode(':',$succes_box);

$error_str='synatx error : starting with {'.$implode_start.'} but endding with {/'.$implode_end.'} on line '.$row.' .';
return 0;
}
*/



$res[]=array('t'=>'end','v'=>$succes_box);





}
else
{
$temp_str.=substr($str,$start_element,$i-$start_element+1);
}

}
else{

$temp_str.=$str[$i];
if(ord($str[$i])==10){
$row++;
}
}
$i++;
}


// if(!empty($error))
// {
// return 0;
// }


if(strlen($temp_str))
{
$res[]=array('t'=>'text','v'=>$temp_str);


}
/*
if(!empty($stack))
{

while(!empty($stack))
{
$pop=array_pop($stack);
$res[]=array('t'=>'end','v'=>($pop));
}
}
*/




$str_res=serialize($res);


return 1;
}


}



$blog_template_parse=new blog_template_parse();


$template="<BlogPostBlock id=55>this string</BlogPostBlock>";
$blog_template_parse->literally_parse($template,$str_res,$blog_template_ error);




if(strlen($blog_template_error))
{
die($blog_template_error) ;
}
$arr=unserialize($str_res);



var_dump($arr);






خروجی


array
0 =>
array
't' => string 'start' (length=5)
'v' => string 'blogpostblock' (length=13)
'p' =>
array
'id' => string '55' (length=2)
1 =>
array
't' => string 'text' (length=4)
'v' => string 'this string' (length=11)
2 =>
array
't' => string 'end' (length=3)
'v' => string 'blogpostblock' (length=13)

ms11309
پنج شنبه 29 خرداد 1393, 12:19 عصر
بطور کلی اینجور کارها رو با RegExp و یا همین توابع ساده رشته ای میشه به راحتی انجام داد. البته سرویسهای وبلاگدهی از موتورهای قالب استفاده میکنن یا خودشون یکی برای کار خودشون طراحی میکنن.

لطفا شما هم راه پیشنهادی خودتون رو با مثال قرار بدید تا مقایسه کنم

MMSHFE
پنج شنبه 29 خرداد 1393, 12:48 عصر
$str = <<<EOT
<BlogPostBlock id=1>
<BlogTitle>
<BlogPostBlock id=5>
<BlogCommentBlock>
EOT;
$blockPostBlocks = array();
if(preg_match_all('#<blogpostblock\s+id=(\d+)>#im', $str, $blockPostBlocks)) {
echo '<p>You have ' . count($blockPostBlocks[1]) . ' "BlogPostBlock" tags:</p>' . PHP_EOL;
foreach($blockPostBlocks[1] as $index => $bpb) {
echo '<p>ID #' . $index . ' : ' . $bpb . '</p>' . PHP_EOL;
}
}

/*
Output:

You have 2 "BlogPostBlock" tags:
ID #0 : 1
ID #1 : 5

*/