preg or str replace

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
iffor
Δημοσιεύσεις: 778
Εγγραφή: 14 Μάιος 2005 01:19
Τοποθεσία: Παράδεισος
Επικοινωνία:

preg or str replace

Δημοσίευση από iffor » 25 Οκτ 2006 11:28

Καλημερούδια!!!

Δυστυχώς επανέρχομαι με μια ερώτηση που έχει να κάνει με preg_replace!!!!
Δεν τα βγάζω πέρα με τα patern, με δυσκολεύουν αρκετά στην κατανόηση...

Θα μπορούσε κάποιος να δώσει ένα tip για το παρακάτω πχ παράδειγμα?
Έστω ότι έχω το string

Κώδικας: Επιλογή όλων

$str = "abc def ghij {begin} klm def opqr {end} stu vwxyz";
Θα μπορούσα κάπως να κάνω κάποιο preg_replace το πχ "def" με "test," αλλά μόνο για όσα "def" βρίσκονται εκτός του {begin}...{end}???

Χίλια ευχαριστώ!!!

Και ακόμη κάποια καλά reference για replaces και paterns στην php αν ξέρετε!!!
Και το λέω με την έννοια κάποια tut με κλιμακωτή δυσκολία, μιας και όσα έχω βρει από τα πολύ εύκολα σε πετάνε κατευθείαν στα βαθεια και μετά χάνω τον μπούσουλα...

Και πάλι ευχαριστώ!!!!
μια νέα αρχή ξεκίνησε...
ένας καινούριος δρόμος άνοιξε...
redpanda.gr

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

preg or str replace

Δημοσίευση από panosru » 25 Οκτ 2006 16:52

eimai sto grafeio tora kai den tha prolabo na grapso kati.. an thes omos des kai ayta ta links, kai to bradaki (11 - 12) pou tha eimai spiti tha to tsekaro.
kapoia links edo:

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

preg or str replace

Δημοσίευση από fafos » 25 Οκτ 2006 17:27

Mpakale alla douleuei :D

Κώδικας: Επιλογή όλων

<?
$str = "abc def ghij &#123;begin&#125; klm def opqr &#123;end&#125; stu vwxyz";

$str1 = str_replace&#40;"%start%", "@", "%start%$str"&#41;;
$str1 = str_replace&#40;"%end%", "#", "$str1%end%"&#41;;
$startpoint = "@";
$endpoint = "&#123;begin&#125;";
$startme= strpos&#40;$str1, "$startpoint"&#41;;  
$finish= strpos&#40;$str1, "$endpoint"&#41;;  
$start= $finish-$startme;
$start=substr&#40;$str1, $startme, $start&#41;;
$start = eregi_replace&#40; "@", "", $start&#41;;

$end = eregi_replace&#40; "&#91;^@&#93;*end&#125;", "", $str1 &#41;;
$end = eregi_replace&#40; "#", "", $end &#41;;
$end = eregi_replace&#40; "@", "", $end &#41;;

$str2 = eregi_replace&#40; "@&#91;^&#125;&#93;*begin&#125;", "", $str1 &#41;;


$str2 = eregi_replace&#40; "&#123;&#91;^&#123;&#93;*#", "", $str2 &#41;;

$patterns&#91;0&#93; = '/def/';
$replacements&#91;0&#93; = 'test';
$newphrase = preg_replace&#40;$patterns, $replacements, $str2&#41;;
echo "$start $newphrase $end";
?>
Gia na to anlysoume ligo..
Sto str1 tou leme na valei to @ mprosta apo thn frash
Sto epomeno str1 tou leme na valei ena # sto telos ths frashs

Me ta $startpoint kai $endpoind pairnoume tis arxikes lekseis prin to begin kai tis kratame gia na tis topothetisoume sthn telikh emfanish
Me to $end pairnoume tis teleytaies lekseis tis opoies kratame epishs..


Sto str2 tou leme na afairesei oles tis lekseis prin to {begin}
Sto epomeno str2 tou leme na afairesei oles tis lekseis meta to {end}


Mexri edo exoume krathsei tis lekseis klm def opqr..
Me to $newphrase kanoume thn antikatastash tou def kai pairnoume thn frash:
klm test opqr

Kai telos emfanizoume to teliko apotelesma kanontas echo to $start to $newphrase kai to $end gia na paroume thn telikh frash:

abc def ghij klm test opqr stu vwxyz
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

preg or str replace

Δημοσίευση από panosru » 25 Οκτ 2006 17:38

Κώδικας: Επιλογή όλων

abc def ghij &#123;begin&#125; klm def opqr &#123;end&#125; stu vwxyz
abc def ghij         klm test opqr      stu vwxyz
ma etsi xanete kai to {begin} kai to {end} kai to def anamesa tous allazei se test kai to def ekso apo ayta paramenei def, o iffor eipe pos thelei na allaksei to def pantou ekso apo ta open & colse tags eno ta tags na paramenoun kai otidhpote mesa sta tags na mhn allazei, gia na sou doso na katalabeis zhtaei kati san to noparse tou vbulletin. ;)

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

preg or str replace

Δημοσίευση από fafos » 25 Οκτ 2006 17:46

panosru έγραψε:

Κώδικας: Επιλογή όλων

abc def ghij &#123;begin&#125; klm def opqr &#123;end&#125; stu vwxyz
abc def ghij         klm test opqr      stu vwxyz
ma etsi xanete kai to {begin} kai to {end} kai to def anamesa tous allazei se test kai to def ekso apo ayta paramenei def, o iffor eipe pos thelei na allaksei to def pantou ekso apo ta open & colse tags eno ta tags na paramenoun kai otidhpote mesa sta tags na mhn allazei, gia na sou doso na katalabeis zhtaei kati san to noparse tou vbulletin. ;)
Esto kai etsi allazei tous kanones sto preg_replace:

Κώδικας: Επιλογή όλων

$patterns&#91;0&#93; = '/def/';
$replacements&#91;0&#93; = 'test';
$start = preg_replace&#40;$patterns, $replacements, $start&#41;; 
$end = preg_replace&#40;$patterns, $replacements, $end&#41;; 
echo "$start $str2 $end"; 
Oloklhromeno:

Κώδικας: Επιλογή όλων

<?
$str = "abc def ghij &#123;begin&#125; klm def opqr &#123;end&#125; stu vwxyz";

$str1 = str_replace&#40;"%start%", "@", "%start%$str"&#41;;
$str1 = str_replace&#40;"%end%", "#", "$str1%end%"&#41;;
$startpoint = "@";
$endpoint = "&#123;begin&#125;";
$startme= strpos&#40;$str1, "$startpoint"&#41;;  
$finish= strpos&#40;$str1, "$endpoint"&#41;;  
$start= $finish-$startme;
$start=substr&#40;$str1, $startme, $start&#41;;
$start = eregi_replace&#40; "@", "", $start&#41;;
$start = str_replace&#40;"%begin%", "&#123;begin&#125;", "$start%begin%"&#41;;

$end = eregi_replace&#40; "&#91;^@&#93;*end&#125;", "", $str1 &#41;;
$end = eregi_replace&#40; "#", "", $end &#41;;
$end = eregi_replace&#40; "@", "", $end &#41;;
$end = str_replace&#40;"%end%", "&#123;end&#125;", "%end%$end"&#41;;

$str2 = eregi_replace&#40; "@&#91;^&#125;&#93;*begin&#125;", "", $str1 &#41;;


$str2 = eregi_replace&#40; "&#123;&#91;^&#123;&#93;*#", "", $str2 &#41;;

$patterns&#91;0&#93; = '/def/';
$replacements&#91;0&#93; = 'test';
$start = preg_replace&#40;$patterns, $replacements, $start&#41;;
$end = preg_replace&#40;$patterns, $replacements, $end&#41;;
echo "$start $str2 $end";?>
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

preg or str replace

Δημοσίευση από panosru » 25 Οκτ 2006 19:20

xexe oraios, dystixos den exo xrono na to diabaso :/ douleia rules :P molis pao spiti tha to tsekaro!! :D

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

preg or str replace

Δημοσίευση από cpulse » 25 Οκτ 2006 19:50

Μάλλον η λύση του fafou θα λειτουργεί μια χαρά.. αλλά πάρε και μία ακόμα..

Κώδικας: Επιλογή όλων

if &#40;preg_match&#40;'/&#123;begin&#125;&#40;.*&#41;&#123;end&#125;/', $str, $m&#41;&#41; $str = str_replace&#40;$m&#91;0&#93;, '&#123;begin&#125;' . str_replace&#40;'def', 'test', $m&#91;1&#93;&#41; . '&#123;end&#125;', $str&#41;;

Άβαταρ μέλους
iffor
Δημοσιεύσεις: 778
Εγγραφή: 14 Μάιος 2005 01:19
Τοποθεσία: Παράδεισος
Επικοινωνία:

preg or str replace

Δημοσίευση από iffor » 26 Οκτ 2006 11:08

Ωραίος fafos!!!
Απλά μια ολοκληρωμένη λύση!!!
fafos +++

U 2 cpulse!!!!
Μήπως θα μπορούσες να κάνεις το ίδιο αλλάζοντας τα def εκτός των tag {begin}...{end}?!?!?
Μιας και με αυτό τον τρόπο αλλάζεις τα def μέσα στα tags!!!
I Like it πάντος!!!

Χίλια ευχαριστώ πάντος παιδιά!!!
μια νέα αρχή ξεκίνησε...
ένας καινούριος δρόμος άνοιξε...
redpanda.gr

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

preg or str replace

Δημοσίευση από cpulse » 26 Οκτ 2006 11:37

Με την δικιά μου λύση θα μπορούσες παραλλάζοντας το pattern σε κάτι σαν /(.*){begin}(.*){end}(.*)/

Αλλά έχω την εντύπωση οτι πας να κάνεις κάτι σαν το BBCode με πολλά {begin} και {end}..
Αν έχεις κάτι τέτοιο στο μυαλό σου η προσέγγιση του fafou είναι ποιο σωστή.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

preg or str replace

Δημοσίευση από panosru » 26 Οκτ 2006 15:19

mia prosegkish kai apo mena..

Κώδικας: Επιλογή όλων

<?php

function MachOutOf &#40;$find,$replace,$str,$opentag,$closetag&#41;
&#123;
	$str = preg_split&#40;"/&#40;".addslashes&#40;$opentag&#41;.".*?".addslashes&#40;$closetag&#41;."&#41;/i",$str,-1,PREG_SPLIT_DELIM_CAPTURE&#41;;	
	
	foreach &#40;$str as $key => $value&#41;
	&#123;
		if &#40;strcmp&#40;strtolower&#40;substr&#40;$value,0,strlen&#40;$opentag&#41;&#41;&#41;,strtolower&#40;$opentag&#41;&#41; === 0&#41; continue;
		
		$str&#91;$key&#93; = str_replace&#40;$find,$replace,$value&#41;;
	&#125;

	$output_str = join&#40;'',$str&#41;;
	
	return &#40;$output_str&#41;;
&#125;


$str = "abc def ghij &#123;begin&#125; klm def opqr &#123;end&#125; stu vwxyz def &#123;BEGIN&#125; allo ena paradigma me to def &#123;END&#125; kai allo ena def edo...";
$new_str = MachOutOf&#40;'def','daf',$str,'&#123;begin&#125;','&#123;end&#125;'&#41;;

echo $str.'<br />';
echo $new_str.'<br />';

?>
EDIT:
heh ena mikro bugaki sto regular expression :P tha to diorthoso argotera :kaloe:

EDIT2:
Ela tora einai ok :P :hammer:

Άβαταρ μέλους
iffor
Δημοσιεύσεις: 778
Εγγραφή: 14 Μάιος 2005 01:19
Τοποθεσία: Παράδεισος
Επικοινωνία:

preg or str replace

Δημοσίευση από iffor » 30 Οκτ 2006 20:57

panosru++
Ωραίος μεγάλε!!!

Μια βοήθεια ακόμη!? :roll:
Μιας και έχει να κάνει πάλι με τα regular expression, θα συνεχίσω το ίδιο thread, μην ανοίξω αλλο, δεν λέει...

με την preg_match μπορώ ( θα το πω λίγάκι λαικά ) να βρώ τα substring που ταιριάζουν στο patern που δίνεται, ενός string
πχ έχω το εξής preg_match('/{begin}(.+?){end}/', $str, $m)
αν μέσα στο $str έχω και τους χαρακτήρες ? ή και + θα χτυπήσει το preg_match

Πως θα μπορούσα να το αποφύγω αυτό?!?!
Με preg_match('/{begin}(.*){end}/', $str, $m) πάλι χτυπάει στα ? και +

Ευχαριστώ!!!
μια νέα αρχή ξεκίνησε...
ένας καινούριος δρόμος άνοιξε...
redpanda.gr

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

preg or str replace

Δημοσίευση από cpulse » 30 Οκτ 2006 21:16

preg_match('/{begin}(.*){end}/', $str, $m) ... δεν χτυπάει πουθενά

. σημαίνει χαρακτήρας
* σημαίνει από 0 έως άπειρους χαρακτήρες
+ σημαίνει από 1 έως άπειρους χαρακτήρες
? σημαίνει από 0 έως 1 χαρακτήρα

αν τα βάλεις όλα μαζί δεν ξέρω τι μπορεί να βγάλουν

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

preg or str replace

Δημοσίευση από panosru » 30 Οκτ 2006 21:35

nai alla ama baleis '/{begin}(.*){end}/' an exeis px ena str opos to :

Κώδικας: Επιλογή όλων

abc def ghij &#123;begin&#125; klm def opqr &#123;end&#125; stu vwxyz def &#123;BEGIN&#125; allo ena paradigma me to def &#123;END&#125; kai allo ena def edo...
tha kanei match to

Κώδικας: Επιλογή όλων

&#123;begin&#125; klm def opqr &#123;end&#125; stu vwxyz def &#123;BEGIN&#125; allo ena paradigma me to def &#123;END&#125;
dld ama kaneis split tha exeis os epistrofh ta

Κώδικας: Επιλογή όλων

abc def ghij
kai

Κώδικας: Επιλογή όλων

kai allo ena def edo...
eno ama to regexp sou einai ths morfhs '/{begin}(.*?){end}/'

tha exeis mach ta

Κώδικας: Επιλογή όλων

&#123;begin&#125; klm def opqr &#123;end&#125;
kai

Κώδικας: Επιλογή όλων

&#123;BEGIN&#125; allo ena paradigma me to def &#123;END&#125;
opote sto split tha exeis os epistrofh
ta

Κώδικας: Επιλογή όλων

abc def ghij

Κώδικας: Επιλογή όλων

 stu vwxyz def 
kai

Κώδικας: Επιλογή όλων

 kai allo ena def edo...
PS: sorry ligo tha sthn bro thn lysh apla eimai apo proponhsh kai tremoun kapos ta xeria mou kai den mporo na grapso akoma..

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

preg or str replace

Δημοσίευση από panosru » 30 Οκτ 2006 21:58

//back

@iffor dokimase ksana to

Κώδικας: Επιλογή όλων

$str = 'aaaaaaaaaaaaaa &#123;begin&#125; bbbbb * bbbbb ? b + bbbb &#123;end&#125; ccccccccccccc';
preg_match&#40;'/&#123;begin&#125;&#40;.*&#41;&#123;end&#125;/i', $str, $m&#41;;

echo '<pre>';
print_r&#40;$m&#41;;
echo '</pre>';
kai grapse akribos to error pou bgazei (emena douleyei apsoga).

episeis, kati akoma to script pou egrapsa prin periexei to foreach, to foreach omos kanei ena clone to array os apotelesma n' argei... merika dekata :D opote mporoume na tou ayksanoume thn taxythta spazontas thn mia function se 2 kai bazontas ena array walker na... "perpathsei" :P

opote mporoume na exoume to eksis:

Κώδικας: Επιλογή όλων

function _replace &#40;&$value,$key,$vars&#41;
&#123;
	if &#40;!&#40;strcmp&#40;strtolower&#40;substr&#40;$value,0,strlen&#40;$vars&#91;2&#93;&#41;&#41;&#41;,strtolower&#40;$vars&#91;2&#93;&#41;&#41; === 0&#41;&#41;
	&#123;
		$value = str_replace&#40;$vars&#91;0&#93;,$vars&#91;1&#93;,$value&#41;;
	&#125;
	
	return &#40;$value&#41;;
&#125;

function MachOutOf &#40;$find,$replace,$str,$opentag,$closetag&#41;
&#123;
	if &#40;!&#40;is_array&#40;$str&#41;&#41;&#41;
	&#123;
		$value = preg_split&#40;"/&#40;".addslashes&#40;$opentag&#41;.".*?".addslashes&#40;$closetag&#41;."&#41;/i",$str,-1,PREG_SPLIT_DELIM_CAPTURE&#41;;
		
		array_walk&#40;$value,'_replace',array&#40;$find,$replace,$opentag&#41;&#41;;
	&#125;
	
	return &#40;join&#40;'',$value&#41;&#41;;
&#125;



$str = "abc def ghij &#123;begin&#125; klm def opqr &#123;end&#125; stu vwxyz def &#123;BEGIN&#125; allo ena paradigma me to def &#123;END&#125; kai allo ena def edo...";
$new_str = MachOutOf&#40;'def','daf',$str,'&#123;begin&#125;','&#123;end&#125;'&#41;;

echo $str.'<br />';
echo $new_str.'<br />';
Genikotera otan programmatizo xoris tis functions se deytereyon kai proteyon, oi proteyon einai aytes pou kalo ap' eytheias kai deytereyon aytes pou kalo hte mesa se mia class hte mesa apo allh function. an den einai kati katanohto apo ton kodika mou les kai eksigo...

EDIT:

Mporeis na xrhshmopoihseis to parakato script gia na deis thn diafora sto load ths selidas. baibea me ayto to str den fenete megalh diafora idos me to mati genikotera den fenete diafora alla otan tha exeis ena megalo str kai th' arghsei h preg_split (mias kai oi preg argoune genikotera) na spasei to str tote tha exeis ena megalo array os apotelesma kai to foreach tha prepei na to kanei clone eno to array_walk oxi opote asxetos an epikalhte mia function kathe fora fortonei arketa poio grhgora apo ton syndiasmo tou script aytou me to foreach.

Κώδικας: Επιλογή όλων

echo 'To script fortose se '.number_format&#40;microtime&#40;&#41;,2&#41;.'sec.';

Άβαταρ μέλους
iffor
Δημοσιεύσεις: 778
Εγγραφή: 14 Μάιος 2005 01:19
Τοποθεσία: Παράδεισος
Επικοινωνία:

preg or str replace

Δημοσίευση από iffor » 30 Οκτ 2006 22:22

:D
Τα script σας μια χαρά λειτουργούν cpulse και panosru!!
Εγώ εξήγησα το πρόβλημά μου με άθλιο τρόπο!!! sorry!!!

Λοιπόν, θα το πάρω από την αρχή!!!
Έστω ότι έχω το

Κώδικας: Επιλογή όλων

$text = preg_replace&#40; "/&#123;value=".$match."&#125;/", "<div class=\"aclass\">".$match."</div>", $text &#41;;
και έστω ότι τυχαίνει στο $match να έχω ως τελευταίο χαρακτήρα του string κάποιον από τους ? ή +
θα προσέξεται ότι δεν εκτελείται όπως θα ήθελα το preg_replace, μιας και τους ?,+ τους θεωρεί μέρος του patern...
Αυτό που αναρωτιέμαι είναι αν θα μπορούσα να το γλυτώσω αυτό!
Η λύση που έκανα τώρα, για να μην φάω όλο τον χρόνο μου σε αυτό, ήταν να αντικαταστήσω στο $match τους ? ή και + με τα αντίστοιχα entities τους...
Δεν μου αρέσει όμως ιδιαίτερα ως ιδέα, για αυτό και ήθελα να το ρωτήσω σε εσάς!!!
μια νέα αρχή ξεκίνησε...
ένας καινούριος δρόμος άνοιξε...
redpanda.gr

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης