PDA

View Full Version : خطا در قطعه کد ریجکس



nokhodi
شنبه 18 مرداد 1393, 12:25 عصر
دوستان نیاز دارم همچین قطعه کدی رو بنویسم...اما خطا میده...:(


$string = ereg_replace("^", "<p dir="rtl" align="justify" style="line-height:40px>"", $string);
$string = ereg_replace("$", "</p>", $string);


ممون میشم راهنمایییم کنید

MMSHFE
شنبه 18 مرداد 1393, 13:00 عصر
متن خطا چیه؟ از preg_replace استفاده کنید. ereg منسوخ شده.

2undercover
شنبه 18 مرداد 1393, 13:21 عصر
هم چنین شما باید کاراکتر های " رو درون Pattern اسکیپ بکنید.

nokhodi
یک شنبه 19 مرداد 1393, 08:53 صبح
متن خطا چیه؟ از preg_replace استفاده کنید. ereg منسوخ شده.

122126


هم چنین شما باید کاراکتر های " رو درون Pattern اسکیپ بکنید.

میشه لطفا توضیح بدین که چیکار کنم؟!

nokhodi
سه شنبه 21 مرداد 1393, 12:33 عصر
دوستان کسی راه حلی نداره؟!

MMSHFE
سه شنبه 21 مرداد 1393, 14:15 عصر
$string = preg_replace('#^(.*?)$#m', '<p dir="rtl" align="justify" style="line-height:40px">$1</p>', $string);

nokhodi
سه شنبه 28 مرداد 1393, 08:40 صبح
$string = preg_replace('#^(.*?)$#m', '<p dir="rtl" align="justify" style="line-height:40px">$1</p>', $string);


ممنونم دوست عزیز...
فاصله بین خطوط و جاستی فای بودن متن درست شد اما به هیچ عنوان راسچین نمیشه :(
حتی الاین رایت هم گذاشتم جواب نداد...

میشه لطفا راهنمایی کنید...
و اینکه میشه لطفا این تیکه از کد رو توضیح بدین : ('#^(.*?)$#m',


سپاس

MMSHFE
سه شنبه 28 مرداد 1393, 08:49 صبح
این مشکل بخاطر استایل خاصی هست که استفاده کردین. بعضی استایلهای CSS هستن که یکسری عناصر رو براشون قالب نمایش رو که تعریف میکنن با دستور important! و... اولویت میدن به قالب خودشون. این کد رو تست کنید:

$string = preg_replace('#^(.*?)$#m', '<p dir="rtl" align="justify" style="direction:rtl !important;line-height:40px;text-align:justify !important;">$1</p>', $string);

و اینکه میشه لطفا این تیکه از کد رو توضیح بدین : ('#^(.*?)$#m',
کلاً عبارات با قاعده توی RegExp و توابعی مثل preg_replace و... باید توی یک جفت کارکتر مشخص کننده محدوده قرار بگیرن که بهشون میگیم Delimiter و این کارکترها میتونن هر چیزی باشن ولی اگه از همین کارکترها توی خود الگوی عبارت باقاعده بخوایم استفاده کنیم باید با \ خنثی (Escape) کنیم تا با Delimiter اشتباه گرفته نشه. من هم چون از کارکتر # کمتر توی عبارات استفاده میکنم این کارکتر رو بعنوان Delimiter مورد استفاده قرار دادم. حالا هرچی بین #...# هست میشه الگوی عبارت باقاعده ما. ^ یعنی ابتدای رشته و $ یعنی انتهای رشته و (.*?) هم باعث میشه هرچی بین اینها هست بصورت یک دسته قرار بگیره که موقع تغییر دادن (توی پارامتر دوم دستور preg_replace) این پرانتزها به ترتیب با 1$ و 2$ و... قابل دسترسی هستن. تغییردهنده m هم که بعد از Delimiter پایانی اومده یعنی Multiline و باعث میشه این الگو توی تمام سطرها بطور منفرد اعمال بشه و اگه نگذاریم، کل متن رو یکجا پردازش میکنه نه خط به خط و درنتیجه هدفی که شما خواستین (تبدیل هر سطر فایل به تگ p) حاصل نمیشه. حالا به پارامتر دوم اگه دقت کنید میبینید که تگ p قبل از 1$ (یعنی همون چیزی که تو پرانتز در قسمت اول بوده) باز شده و بعدش بسته شده. به همین سادگی.

nokhodi
سه شنبه 28 مرداد 1393, 09:23 صبح
یک مشکل اساسی رو برای من حل کردین...خیلی زیاد ممنونم...

بابت توضیحلتتون هم سپاسگزارم :لبخندساده:

nokhodi
چهارشنبه 29 مرداد 1393, 09:21 صبح
سک سوال دیگه :

آیا برای جدا کردن اعدادی که در متغیر زیر هست هم میشه از ریجکس استفاده کرد یا روش کار متفاوته :


$test="[gallery columns="5" link="file" ids="6285,6286,6287,6288,6282,6283,6284"]"


هر کدوم از این اعداد ای دی یک عکس هست که باید از دستور بالا جدا بشه...وبا دستورات sql لینک عکس رو از بانک در بیارم...
بخش دوم کار رو مشکل ندارم...یعنی اگر اعداد رو داشته باشم میتونم لینک رو با یه تابع بگیرم...اما اینکه اعداد رو چطوری از اون متغیر جدا کنم و بصورت تکی تکی باشه برام سوال هست...


سپاس

nokhodi
چهارشنبه 29 مرداد 1393, 09:24 صبح
اینجا هم یکسری مثال داشت که خوندم اما چیزی دستگیرم نشد

http://www.roscripts.com/PHP_regular_expressions_examples-136.html

MMSHFE
چهارشنبه 29 مرداد 1393, 09:59 صبح
$test = '[gallery columns="5" link="file" ids="6285,6286,6287,6288,6282,6283,6284"]';
$ids = array();
if(preg_match('#ids="(.*?)"#i', $test, $ids)) {
$ids = explode(',', $ids[1]);
}
/*
$ids = array(
6285,
6286,
6287,
6288,
6282,
6283,
6284,
);
*/

nokhodi
چهارشنبه 29 مرداد 1393, 11:09 صبح
قطعه کدتون رو تو برنامه ی که نوشته بودم گذاشتم اما فک کنم برنامه من اشتباست!!!
این خطا رو میده :
Unknown column 'Array' in 'where clause'





<?php




$test="لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از طراحان گرافیک است. چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد نیاز و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد. کتابهای زیادی در شصت و سه درصد گذشته، حال و آینده شناخت فراوان جامعه و متخصصان را می طلبد تا با نرم افزارها شناخت بیستری را برای طراحان رایانه ای و فرهنگ پیشرو در زبان فارسی ایجاد کرد
[gallery columns="5" link="file" ids="6285,6286,6287,6288,6282,6283,6284"]"


$ids = array();
if(preg_match('#ids="(.*?)"#i', $test, $ids)) {
$ids = explode(',', $ids[1]);
}


for($i=0;$i<=15;$i++){
posts($ids);
}




?>




<?php


function posts($p1)
{

global $row_rs1;
global $rs1;
global $database_cn;
global $cn;

$id_post=$p1;


mysql_select_db($database_cn, $cn);
$query_rs1 = "SELECT `wp_posts`.`guid`
FROM `wp_posts`
WHERE ID =$id_post";
$rs1 = mysql_query($query_rs1, $cn) or die(mysql_error());
$row_rs1 = mysql_fetch_assoc($rs1);
$totalRows_rs1 = mysql_num_rows($rs1);




echo $row_rs1['guid'];


}
?>

MMSHFE
چهارشنبه 29 مرداد 1393, 11:17 صبح
بجای حلقه for خودتون اینو تست کنید:

foreach($ids as $id) {
post($id);
}

nokhodi
چهارشنبه 29 مرداد 1393, 11:19 صبح
ممنونم ادرس ها رو داد... :)

MMSHFE
چهارشنبه 29 مرداد 1393, 11:23 صبح
خوب اسم رو درست کنید. بجای post از posts استفاده کنید. اشتباه تایپی بوده.

nokhodi
چهارشنبه 29 مرداد 1393, 14:21 عصر
بله حق با شماست...حواسم نبود...بعد درست کردم و پست رو ویرایش کردم...که ادرس ها رو داد...

nokhodi
جمعه 31 مرداد 1393, 20:12 عصر
توی یک متغیر دیگه چنین مقداری دارم :


در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه راهکارها و شرایط سخت تایپ به پایان رسد وزمان مورد نیاز شامل حروفچینی دستاوردهای اصلی و جوابگوی سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.



در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه راهکارها و شرایط سخت تایپ به پایان رسد وزمان مورد نیاز شامل حروفچینی دستاوردهای اصلی و جوابگوی سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.




برای فهمیدن اینکه ایا همچین چیزی وجود داره :



کد ریجکس زیر رو نوشتم اما جواب نداد :


if(preg_match("/\[video[ a-z=\"0-9,]+\]/",$text)){
.
.
.
}


و اینکه ایا با توابع php میتونم لینک فایل ویدیویی رو در یک متغیر رشته ای استخراج کنم یا اونم باید حتما با ریجکس باشه؟!


استفاده از ریجکس خیلی گیج کننده است:افسرده:
هیچ منبعی فارسی هم نیست یکم واضح توضیح داده باشه...:(


پیشاپیش ممنونم

MMSHFE
شنبه 01 شهریور 1393, 09:36 صبح
$text = <<<EOT
در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه راهکارها و شرایط سخت تایپ به پایان رسد وزمان مورد نیاز شامل حروفچینی دستاوردهای اصلی و جوابگوی سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.



در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه راهکارها و شرایط سخت تایپ به پایان رسد وزمان مورد نیاز شامل حروفچینی دستاوردهای اصلی و جوابگوی سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.




برای فهمیدن اینکه ایا همچین چیزی وجود داره :



EOT;

$videos = array();
if(preg_match_all('#\[video.*?mp4="(.*?)"\]\[/video\]#is', $text, $videos)) {
foreach($videos as $id => $video) {
echo '<pre>[' . $id . '] => ' . print_r(array_map('trim', $video), true) . '</pre><hr />' . PHP_EOL;
}
}
/* Output:

[0] => Array
(
[0] =>

[1] =>

[2] =>

)
--------------------------------------------------------------------------------
[1] => Array
(
[0] => http://www.xxx.com/wp-content/upload...m020580004.mp4
[1] => http://www.xxx.com/wp-content/upload...m020580003.mp4
[2] => http://www.xxx.com/wp-content/upload...m020580003.mp4
)
--------------------------------------------------------------------------------

*/
اگه به RegExp عادت کنید، اصلاً سخت نیست. یکم روش وقت بگذارین. بعنوان یک برنامه نویس، باید از یکی از بهترین ابزارهایی که در اختیار دارین بتونید به شکل سودمند استفاده کنید.

nokhodi
شنبه 01 شهریور 1393, 09:54 صبح
میبخشین یه چدتا سوال کوچیک در رابطه با قطعه کدی که نوشتین دارم :



آیا اضافه کردن



$text = <<<EOT
.
.
.
EOT;


به ایتدا و انهتی متغیر الزامیه؟! و برای چیه؟




یکم ارایه تداخلی شد!!! مث قبلب این سوال که به لینک عکسها احتیاج بود تا تگ بهشون اضافه کنم... چطوری به تگ تگشون میتونم دسترسی داشته باشم تا تگ ویدیو بهشون اضافه کنم برای نشون دادن توی یه صفحه html







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


ممنونم

MMSHFE
شنبه 01 شهریور 1393, 11:20 صبح
1- نه اجباری نیست. به این ساختار میگن HereDoc که توی پکیج PHP خودم که تو امضام هست کامل توضیح دادم. بطور خلاصه، این ساختار با >>> و یک Delimiter شروع میشه و بعد متن دلخواه رو مینویسید که میتونه چندسطری باشه و آخرش باید دوباره همون Delimiter رو عیناً در ابتدای یک سطر بنویسید (سمی کالن بعدش اختیاریه).
2- یا باید از preg_replace استفاده کنید و بجای لینک از 1$ استفاده کنید و یا اگه خواستین کلاً متن دلخواه خودتون رو بسازین، الان توی اندیس 1 آرایه videos وجود داره ($videos[1])

nokhodi
شنبه 01 شهریور 1393, 11:22 صبح
من کد شمارو تغریبا اینجوری تغیر دادم...اما فک کنم مشکل داره


.
.
.


elseif(preg_match_all('#\[video.*?mp4="(.*?)"\]\[/video\]#is', $text, $videos))
{


foreach($videos as $id => $video) {
vedio($videos);


}


}



.
.
.




function vedio($p1)
{


echo '<video width="320" height="240" controls="controls"><source src="'.$p1.'" type="video/mp4"/></video>'


}



ویرایش شد :
ویدیوها رو بخش نمیکنه متاسافانه...فک کنم مشکل از قطعه کد html منه...

nokhodi
شنبه 01 شهریور 1393, 11:35 صبح
فک کنم از $videos درست استفاده نکردم برای فراخوانی تابع...! قسمت درخواست لینک ها که تو. بخش دوم ارایه هست

http://www.xum.ir/images/2014/08/23/Untitled4d348.png

nokhodi
شنبه 01 شهریور 1393, 12:34 عصر
هر کاری میکنم عجیب غریب نشون میده :(((((((((((

nokhodi
شنبه 01 شهریور 1393, 15:08 عصر
میشه لطفا کمک کنید

MMSHFE
شنبه 01 شهریور 1393, 23:50 عصر
توی foreach بجای videos$ از [1]videos$ استفاده کنید. به تابعتون هم video$ رو داخل حلقه ارسال کنید نه videos$ رو :

elseif(preg_match_all('#\[video.*?mp4="(.*?)"\]\[/video\]#is', $text, $videos)) {
foreach($videos[1] as $video) {
video($video);
}
}

function video($video) {
echo '<video width="320" height="240" controls="controls"><source src="' . $video . '" type="video/mp4"/></video>';
}

nokhodi
دوشنبه 10 شهریور 1393, 10:30 صبح
برای عبارات فارسی هم میشه از ریجکس استفاده کرد؟!
برای اینکه بفهمم ابتدای یک رشته مثلا کلمه "جدید" هست...

nokhodi
دوشنبه 10 شهریور 1393, 11:14 صبح
$test="اخبار سلامت";






if(preg_match("/سیاسی/",$test)){
echo "سیاسی";
}
elseif(preg_match("/اجتماعی/",$test)){
echo "سیاسی";
}
else{
echo "سلامت";
}




این کد رو براش نوشتم و جواب داد...ایا از نظر دستوری تو ریجکس مشکلی نداره؟!

nokhodi
دوشنبه 10 شهریور 1393, 12:42 عصر
یکم مسئله پیچیده تر شد :(


$title="<!--سیاسی --> اهمیت سلامت زنان"


توی متغیر بالا کامنت html داریم


و کلمه داخلش هست که اون باید استخراج بشه




سوالم اینه:


چطوری از وجود اون کامنت به صورت کلی ( با هر چیزی که داخلش نوشته میشه) مطلع بشیم و بعد چطوری کلمه داخل اون کامنت رو استخراج کنیم






سپاس

nokhodi
دوشنبه 10 شهریور 1393, 13:04 عصر
این کد رو نوشتم اما جوای نمیده :
:(



$title="<!--سیاسی --> اهمیت سلامت زنان";

if(preg_match("/\<!--[آ-ی]+\-->/u",$title)){


if(preg_match("/<!--سیاسی-->/u",$title)){
echo "سیاسی";
}
elseif(preg_match("/<!--اجتماعی-->/u",$title)){
echo "اجتماعی";
}
elseif(preg_match("/<!--زنان-->/u",$title)){
echo "زنان";
}
}
else echo"khali";