PDA

View Full Version : سوال: جایگزین یک رشته در یک رشته ی بزرگتر



ravand
یک شنبه 03 آذر 1392, 19:32 عصر
سلام .من میخوام یک رشته رو در یک رشته ی بزرگ تر در نظر بگیرم بعد یک رشته ی دیگه رو جایگزینش بکنم . برای مثال این کد رو ببینید:

<?php
$chap="matn morede nazar shoma ke hast reshteye bozorgtar az matn morede nazar shoma ke hast reshteye bozorgtar az";
$chapi=preg_replace("#shoma.*?reshteye#s","جایگزین",$chap);
echo $chapi;
?>
همینطوری که می بینید خروجی یه همچین چیزی هست:

matn morede nazar جایگزین bozorgtar az matn morede nazar جایگزین bozorgtar az
من میخوام تمام رشته هایی که به این تابع داده میشه به صورت آرایه باشه.
یعنی به جای رشته shoma وreshteye و"جایگزین" آرایه باشه . چون میخوام این مقادیر رو از دیتابیس بگیرم و جایگزین کنم. برای همین به صورت آرایه درش آوردم ولی این اتفاق نیوفداد و درست جایگزین نشد.
متشکرم.

abolfazl-z
یک شنبه 03 آذر 1392, 20:23 عصر
فکر کنم منظورتون این کد باشد :


<?php
$chap="matn morede nazar shoma ke hast reshteye bozorgtar az matn morede nazar shoma ke hast reshteye bozorgtar az";
$chapi= preg_replace(["#shoma.*?reshteye#s","#shoma.*?reshteye#s"],['****','++++'],$chap,1);
echo $chapi;
?>

abolfazl-z
یک شنبه 03 آذر 1392, 20:28 عصر
درضمن به صورت ذیل هم میتوانید استفاده کنید :


<?php
$chap="matn morede nazar shoma ke hast reshteye bozorgtar az matn morede nazar shoma ke hast reshteye bozorgtar az";
$chapi= preg_replace(['/reshteye/','/reshteye/'],['****','++++'],$chap,1);
echo $chapi;
?>

ravand
یک شنبه 03 آذر 1392, 20:29 عصر
نه داداش. شما به چیزی که گفتم دقت کن. من گفتم این مقادیری که به تابع داده شده میخوام از دیتابیس بگیرم. پس مقادیر ثابت نیست که شما این مثال رو زدی. چون مقادیر داخل دیتابیس زیاده. و در حال اضافه شدن.

ravand
یک شنبه 03 آذر 1392, 20:33 عصر
درضمن به صورت ذیل هم میتوانید استفاده کنید :


<?php
$chap="matn morede nazar shoma ke hast reshteye bozorgtar az matn morede nazar shoma ke hast reshteye bozorgtar az";
$chapi= preg_replace(['/reshteye/','/reshteye/'],['****','++++'],$chap,1);
echo $chapi;
?>
به کدی که نوشتم دقت کنید :
گفتم از رشته ی shoma تا رشته ی reshteye حذف شود و رشته ی "جایگزین" که شامل رشته هایی است که داخل دیتابیس هست جایگزین شود.
الان من مقادیر shoma و reshteye و جایگزین رو به صورت پشت سرهم از دیتابیس میگیرم. یعنی بعدا به جای این رشته ها چیز دیگری خواهد بود. و پشت سر هم باید جایگزین بشن.

abolfazl-z
یک شنبه 03 آذر 1392, 20:38 عصر
گفتم از رشته ی shoma تا رشته ی reshteye حذف شود و رشته ی "جایگزین" که شامل رشته هایی است که داخل دیتابیس هست جایگزین شود.

یعنی هرچی بین این دو رشته هست حذف شود ؟

ravand
یک شنبه 03 آذر 1392, 20:39 عصر
یعنی هرچی بین این دو رشته هست حذف شود ؟

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

abolfazl-z
یک شنبه 03 آذر 1392, 20:48 عصر
ببینید کمکتون می کند :


<?php
$data_search = ['shoma','reshteye'];
$data_replace = ['1'];
$chap="matn morede nazar shoma ke hast reshteye bozorgtar az matn morede nazar shoma ke hast reshteye bozorgtar az";
$myPattern[] = "/{$data_search[0]}.*{$data_search[1]}/";
$chapi= preg_replace($myPattern,$data_replace,$chap,1);
echo $chapi;
?>

ravand
پنج شنبه 07 آذر 1392, 14:27 عصر
من میخواستم بگم که مقادیرم را از دیتابیس میگیرم برای همین گفتم به صورت آرایه برام بنویسید حالا که فکرام رو میکنم می بینم اگه همون دیتابیس رو براتون مثال میزدم بهتر بود.
برنامه ای که میخوام بسازم باید اینطوری باشه : بگه که از رشته ی shoma تا رشته ی reshteye حذف بشه و جاش رشته ی jay1 قرار بگیره .و از رشته ی shomai تا رشته ی reshteyei حذف بشه جاش jay2 قرار بگیره. و همینطوری تا آخر.
بذارید یک مثال کلی بزنم. یک جدول در دیتابیس داریم با نام jadval حاوی فیلد های start و end و jaygozin .
توی این جدول چند تا رکورد ثبت میشه. برنامه ی ما باید بگه از فیلد های start تا end را در نظر بگیر مقادیر داخل jaygozin را به جای مقادیر از start تا end قرار بده.
مثلا در فیلد start رشته های shoma و shomai قرار داره و در فیلد end رشته های reshteye و reshteyei و در فیلد jaygozin رشته های jay1 و jay2 .
رشته ای که به برنامه داده میشه اینه:

matn morede nazar shoma ke hast reshteye bozorgtar az matn morede nazar shoma ke hast reshteye bozorgtar az shomai ke hast reshteyei bozorgtar
خروجی که این برنامه میخوام داشته باشه اینه:

matn morede nazar jay1 bozorgtar az matn morede nazar jay1 bozorgtar az jay2 bozorgtar
متشکرم.

2undercover
پنج شنبه 07 آذر 1392, 14:48 عصر
اینجوری:


preg_replace("/(?=start)(.*)(?<=end)/", 'replace', $string);

که با یک حلقه می تونید یکی یکی سطر های دیتابیس رو واکشی و مقدار های start و end و replace رو توی اون کد جایگزین کنید و نتیجه رو بگیرید!

ravand
پنج شنبه 07 آذر 1392, 15:25 عصر
متشکرم.
امدم اینطوریش کردم اخطار داد:

$chap=$_POST['matn'];
//$chap=str_replace('\"','"',$kood);
//$chap=str_replace("\'","'",$chap);
$servis=$_POST['servis'];
$connection=mysql_connect("localhost","root","1234");
$db=mysql_select_db("database",$connection);
$sql="SELECT * FROM `jadval` where `servis`='{$servis}'";
mysql_query("SET CHARACTER SET utf8",$connection);
$result=mysql_query($sql,$connection);
while ($row=mysql_fetch_array($result)){
$start2 = $row['start2'];
$end2 = $row['end2'];
$jaygozin= $row['jaygozin'];
$chapi=preg_replace("/(?=$start2)(.*)(?<=$end2)/","$jaygozin",$chap);
}

Warning: preg_replace(): Unknown modifier 't' in F:\wamp\www\test\show.php on line 22
دقیقا همین خط رو بهم نشون میده:

$chapi=preg_replace("/(?=$start2)(.*)(?<=$end2)/","$jaygozin",$chap);

2undercover
پنج شنبه 07 آذر 1392, 15:42 عصر
$chapi=preg_replace("/(?=" . preg_quote($start2) . ")(.*)(?<=" . preg_quote($end2). ")/", preg_quote($jaygozin), $chap);

ravand
پنج شنبه 07 آذر 1392, 15:54 عصر
چون در فیلدها از تگ استفاده کرده بودم برای همین اون اخطار رو داد:

<tag></tag>
ولی وقتی به صورت ساده یعنی tag نوشتم دیگه اخطار نداد ولی عین متن رو برام چاپ کرد.
یعنی وقتی نوشتم:

tag متن مورد نظر tagi
عین همین متن بالا رو بهم میده. بدون هیچ تغییری.
این برنامه ای هم که الان بهم دادید این اخطار رو داد:

Warning: preg_replace(): Compilation failed: missing ) at offset 19 in

2undercover
پنج شنبه 07 آذر 1392, 16:03 عصر
ببخشید یک پرانتز رو جا انداخته بودم الان ویرایشش کردم!

2undercover
پنج شنبه 07 آذر 1392, 16:04 عصر
در ضمن با اون کد که دادم باید با:

<tag></tag>

هم کار بکنه!

ravand
پنج شنبه 07 آذر 1392, 16:16 عصر
ببخشید این کد رو گذاشتم هیچ فرقی نکرد بازم عین مطلب ورودی رو نشون میده:

$chapi=preg_replace("/(?=" . preg_quote($start2) . ")(.*)(?<=" . preg_quote($end2). ")/", preg_quote($jaygozin), $chap);

2undercover
پنج شنبه 07 آذر 1392, 16:24 عصر
این یکیو امتحان کردم و با <tag> و </tag> به درستی جواب داد:


$chapi = preg_replace("/(?=" . str_replace('/', "\/", preg_quote($start2)) . ")(.*)(?<=" . str_replace('/', "\/", preg_quote($end2)) . ")/", preg_quote($jaygozin), $chap);

ravand
پنج شنبه 07 آذر 1392, 16:28 عصر
این کد منه نمیدونم چرا بازم عین چیزی که بهش دادم بهم میده!

<center>
<form method="post" dir="ltr">
<textarea dir="ltr" rows="15" cols="40" name="matn"></textarea><br/>
نوع سرویس:<input type="text" dir="ltr" name="servis" /><br/>
<input type="submit" value="ارسال" name="dok" /><br/>
</form>
<?php
if(isset($_POST['dok'])){
$chap=$_POST['matn'];
//$chap=str_replace('\"','"',$kood);
// $chap=str_replace("\'","'",$chap);
$servis=$_POST['servis'];
$connection=mysql_connect("localhost","root","1234");
$db=mysql_select_db("database",$connection);
$sql="SELECT * FROM `jadval` where `servis`='{$servis}'";
mysql_query("SET CHARACTER SET utf8",$connection);
$result=mysql_query($sql,$connection);
while ($row=mysql_fetch_array($result)){
$start2 = $row['start2'];
$end2 = $row['end2'];
$jaygozin= $row['jaygozin'];
//$chapi=preg_replace("/(?=$start2)(.*)(?<=$end2)/", "$jaygozin", $chap);
$chapi = preg_replace("/(?=" . str_replace('/', "\/", preg_quote($start2)) . ")(.*)(?<=" . str_replace('/', "\/", preg_quote($end2)) . ")/", preg_quote($jaygozin), $chap);
}

$persian=htmlentities($chapi, ENT_QUOTES, "UTF-8");
echo "<textarea dir='ltr' rows='10' cols='40'>$persian</textarea>";

mysql_close($connection);
}
?>
</center>

2undercover
پنج شنبه 07 آذر 1392, 16:33 عصر
اون قسمتی که متغیر $chapi رو برابر با حاصل تابع preg_replace قرار دادید, به جای متغیر $chapi از $chap استفاده کنید؟!

Izadshahri
پنج شنبه 07 آذر 1392, 19:26 عصر
یه نگاهی به این صفحه هم بنداز, یه استرینگو به یه مشخصه خاص می تونه آرایه کنی
:
خروجی گرفتن از تابع explode (http://www.phptik.com/%d8%ae%d8%b1%d9%88%d8%ac%db%8c-%da%af%d8%b1%d9%81%d8%aa%d9%86-%d8%a7%d8%b2-%d8%aa%d8%a7%d8%a8%d8%b9-explode/)



هاست Anti DDos (http://central-hosting.com/)

ravand
چهارشنبه 13 آذر 1392, 15:43 عصر
رفتم دو تا دستور اضافه کنم برنامه ام کلاً بهم ریخت:

<center>
<form method="post" dir="ltr">
<textarea dir="ltr" rows="15" cols="40" name="matn"></textarea><br/>
نوع سرویس:<input type="text" dir="ltr" name="servis" /><br/>
<input type="submit" value="ارسال" name="dok" /><br/>
</form>
<?php
if(isset($_POST['dok'])){
$chap=$_POST['matn'];
//$chap=str_replace('\"','"',$kood);
//$chap=str_replace("\'","'",$chap);
$servis=$_POST['servis'];
$connection=mysql_connect("localhost","root","");
$db=mysql_select_db("database",$connection);
$sql="SELECT * FROM `jadval` where `servis`='{$servis}'";
mysql_query("SET CHARACTER SET utf8",$connection);
$result=mysql_query($sql,$connection);
while ($row=mysql_fetch_array($result)){
$start[]=$row['start'];
$end[]=$row['end'];
$jay_start[]=$row['jay-start'];
$jay_end[]=$row['jay-end'];

$start2 = $row['start2'];
$end2 = $row['end2'];
$jaygozin= $row['jaygozin'];
//$chap = preg_replace("/(?=" . str_replace('/', "\/",$start2) . ")(.*)(?<=" . str_replace('/', "\/",$end2) . ")/",$jaygozin, $chap);
$chap = preg_replace("/(?=" . str_replace('/', "\/", preg_quote($start2)) . ")(.*)(?<=" . str_replace('/', "\/", preg_quote($end2)) . ")/", preg_quote($jaygozin),$chap);

}
$chap= str_replace($start,$jay_start,$chap);
$chap= str_replace($end,$jay_end,$chap);

$persian=htmlentities($chap, ENT_QUOTES, "UTF-8");
echo "<textarea dir='ltr' rows='10' cols='40'>$persian</textarea>";
mysql_close($connection);
}
?>
</center>
این دو تا دستور رو اضافه کردم:

$chap= str_replace($start,$jay_start,$chap);
$chap= str_replace($end,$jay_end,$chap);
برای اینکه تگ های تکی جایگزین بشه مثلا تگ <tag> جایگزین تگ <jay> بشه و </tag> جایگزین </jay> بشه.
برنامه کار نکرد. وقتی ام این دو تا دستور رو حذف کردم دیدم بازم برنامه مثل قبلش کار نمیکنه!
فکر کردم کش کرده ولی الان دو روزه همین بساطه!

2undercover
چهارشنبه 13 آذر 1392, 16:42 عصر
خوب شما این دو تا دستور رو بعد از این که رشته رو جایگزین کردید قرار دادید پس دیگه چیزی نیست که جایگزین بشه!

ravand
چهارشنبه 13 آذر 1392, 17:01 عصر
خوب شما این دو تا دستور رو بعد از این که رشته رو جایگزین کردید قرار دادید پس دیگه چیزی نیست که جایگزین بشه!

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

$chap= str_replace($start,$jay_start,$chap);
$chap= str_replace($end,$jay_end,$chap);
راستی این دستورم رو هم اگه تنها بذارم بازم کار نمیکنه! نمیدونم چرا قاطی کرده!

$chap = preg_replace("/(?=" . str_replace('/', "\/", preg_quote($start2)) . ")(.*)(?<=" . str_replace('/', "\/", preg_quote($end2)) . ")/", preg_quote($jaygozin),$chap);