[php]str_replace -> :? word ge-replaced in :?:

Pagina: 1
Acties:
  • 36 views sinds 30-01-2008

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024
Hallo,

Ik ben hier al uren mee bezig, et begin viel allemaal wel mee, maar ik sta nu al uren vast. Search leverde niet veel op...

Het probleem:

Ik heb een smilies script gemaakt, omdat ik die nog niet had, tis gebasseerd op phpbb, maar de code daaruit is te ingewikkeld (en werkt ook niet) om rechtstreeks te gebruiken in mijn script. Het komt erop neer dat hij eerst kijkt hoeveel smilies er zijn, en vervolgens via een while functie alle smiles gaat replacen. (de informatie van smilies staan in een database)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Begin smilie code
$cur_smile = "0";
$query2 = "SELECT * FROM zforum_smilies";
$result2 = mysql_query($query2) or die('error making query1');
$num_smilies = mysql_num_rows($result2);

while ($cur_smile <= $num_smilies) {

$query3 = "SELECT * FROM zforum_smilies
       WHERE smilies_id = $cur_smile";
$result3 = mysql_query($query3) or die('error making query2');
$object = mysql_fetch_object($result3);
$code = $object->code;
$smile_url = $object->smile_url;
$content = str_replace($code, "[img]forum/images/smiles/$smile_url[/img]", $content);

$cur_smile++;
}

//eind smilie code


Alleen replaced hij : ? ook in : ? : (een andere smilie). Ik heb ook al van alles gebropeerd met preg_replace, maar kom er niet uit.

voorbeeld:
:? <-> :?:

Hier doettie het niet, zoals je ziet, bij mij zou je nu :? : zonder spatie ertussen zien.

Research is what I'm doing when I don't know what I'm doing.


Verwijderd

probeer hem eens te escapen, dus :\?

[ Voor 3% gewijzigd door Verwijderd op 09-03-2003 01:39 . Reden: type foutje ]


  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024
Dat zou wel kunnen, maar :?: is een andere smilie. Hij moet dus : ? en : ? : (zonder spaties) als twee verschillende dingen zien, en : ? niet als onderdeel van : ? : (wederom, zonder spaties)

Research is what I'm doing when I don't know what I'm doing.


  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09-2025
eerst die : ? : neerzetten en pas daarna : ? does the trick for me :)

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024
Dat werkt nog niet, naast het feit dat het niet praktisch is, is het fout. : ? : word namelijk alsnog gezien als onderdeel van : ? :, omdat die een vroegere input in de database heeft.

Daarnaast zou het onpraktisch zijn, omdat je je members moeilijk kan verplichten eerst het ene en dan pas de volgende smilie te gebruiken ;)

Research is what I'm doing when I don't know what I'm doing.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

escapen heeft weinig zin, want een ? is in een "gewone php string" geen speciaal karakter ;)

Je kunt dit idd heel eenvoudig door middel van regular expressions oplossen. Bepaal voor je zelf wanneer een smiley daadwerkelijk een smiley is, en wanneer het dat niet is. Probeer dit voor jezelf te beschrijven, en pak vervolgens een regex tutorial waarmee je die beschrijving vertaalt in een patroon.

Je zou bijvoorbeeld een definitie kunnen hanteren waarin je zegt:
'Een smiley mag pas voorkomen als erna een whitespace, een punt staat of een komma staat'.

Als je dat zou vertalen in een regular expression zou dat hier ongeveer op neer komen:
code:
1
/:\?(\s|\.|,)/

Dit ziet er nu wat cryptisch uit, maar pak het stukje PCRE en de daarbij behorende Pattern Syntax pagina's uit de PHP manual eens bij, daar staat heel wat zinvolle informatie in :)

Overigens is deze regex niet helemaal wat je wilt, waarschijnlijk, maar dat komt best uit, want dan kan je het zelf uitvogelen :Y)
edit:
Hier vergeet ik nog bij te melden dat je dus de "linker kant" en de "rechter kant" van de smiley moet bepalen, en dan vervolgens aan de hand van de functie preg_quote de delen samen voegen, om tot een werkende regex te komen



Een andere oplossing is voor jezelf bepalen welke smiley boven anderen voorrang heeft. Als je eerst een :?: smiley zou replacen, en vervolgens pas de :?, dan zou er niets aan de hand zijn ;) Maar dat is een beetje vervelend als je nieuwe smileys toe zou willen voegen, dan moet je elke keer 't volgnummer of precedence van de smiley aangeven, en dat is niet altijd zo geweldig te overzien


Nog een oplossing is bepalen aan de hand van je smiley database, welke smileys allemaal weer onderdelen zijn van anderen. Zodra je dat bepaald hebt, kun je de smileys die geen onderdeel zijn van de anderen het eerst replacen, en vervolgens pas de rest. Dit is verreweg de meest effectieve oplossing voor dit probleem. Maar hiermee kom je in de knoop (net als de 2e oplossing hierboven) zodra je ook andere markup structuren toe gaat laten in je text, dan is de keuze voor regular expressions het best.


Je zou ook nog een grammatica kunnen gaan ontwikkelen, maar da's een beetje extreem, he? :P

[ Voor 7% gewijzigd door drm op 09-03-2003 01:59 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024
Thanx DRM, nuttige tips allemaal....

Ik heb ook wel preg_replace geprobeerd, maar ik kan weinig opmaken uit de pattern syntax. (Kortom, ik vat nog niet zoveel van preg_replace, en kan der ook niet zoveel over vinden...)

Dan krijg ik echter de volgende errors (een hele pagina vol..):

Warning: Empty regular expression in /home/virtual/site48/fst/var/www/html/react.php on line 233

Warning: No ending delimiter ':' found in /home/virtual/site48/fst/var/www/html/react.php on line 233

Warning: Compilation failed: nothing to repeat at offset 0 in /home/virtual/site48/fst/var/www/html/react.php on line 233

Warning: Delimiter must not be alphanumeric or backslash in /home/virtual/site48/fst/var/www/html/react.php on line 233

Warning: Empty regular expression in /home/virtual/site48/fst/var/www/html/react.php on line 233

Warning: No ending delimiter ';' found in /home/virtual/site48/fst/var/www/html/react.php on line 233

Research is what I'm doing when I don't know what I'm doing.


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:17

crisp

Devver

Pixelated

Ik heb hier nog een smiley parse scriptje staan met een regexp waarin ik kijk of er voor en na de smiley een whitespace staat (bijvoorbeeld een spatie of een enter).

Intentionally left blank


  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024
Is opzich een goede oplossing, maar ik wil graag meteen van de 'kans' gebruik maken door nog wat te leren.

Alhoewel dat misschien wel de enige manier is....:?:?

\edit
Die waren even om te testen.....

\edit 2
Wat er eigenlijk gewoon moet gebeuren, is dat hij met preg_replace de inhoud van $code zoekt, maar alleen als het geen deel uitmaakt van een andere code...ofzo...ARGH, ik snap et zelf ook niet meer...

\edit 3
Goed, ik ben nu ongeveer zou ver gekomen:

PHP:
1
2
$c_code = "\($code)\?(\s|\.|\,)\";
$content = preg_replace($c_code, "[img]forum/images/smiles/$smile_url[/img]", $content);


Maar ik vat er geen fuck meer van 8)7

krijg deze error zo'n 30 keer:
Warning: Delimiter must not be alphanumeric or backslash in /home/virtual/site48/fst/var/www/html/react.php on line 233

[ Voor 90% gewijzigd door Roa op 09-03-2003 13:47 ]

Research is what I'm doing when I don't know what I'm doing.


  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
regular expressions zoals je die meegeeft aan preg_replace en familie hebben de vorm
delimiter pattern delimiter modifiers
bij voorbeeld
|a+b+|i
of
/[1-4]*/
je moet dus een teken zowel links als rechts van je pattern neerzetten, bij voorkeur een teken dat niet in je pattern voorkomt (anders moet je dubbel escapen)
zie verder http://www.php.net/manual/nl/ref.pcre.php

Pas de replâtrage, la structure est pourrie.


  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024
Hijs nu zo:

PHP:
1
2
3
$c_code = "/[" . $code . "]*/"; 
$repl = '[img]"forum/images/smiles/'.[/img]'; 
$content = preg_replace($c_code, "$repl", $content);


en ik krijg devolgdende error:

Warning: Compilation failed: missing terminating ] for character class at offset 3 in /home/virtual/site48/fst/var/www/html/react.php on line 234

line 234 is de "$content =..." regel

[ Voor 18% gewijzigd door Roa op 09-03-2003 15:06 ]

Research is what I'm doing when I don't know what I'm doing.


Verwijderd

Ik zou het trouwens anders doen, want stel nou dat de smiley id's niet elkaar telkens opvolgen
Doe het zo:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
//Begin smilie code 
$query2 = "SELECT * FROM zforum_smilies"; 
$result2 = mysql_query($query2) or die('error making query1'); 
$num_smilies = mysql_num_rows($result2); 

while ($object = mysql_fetch_object($result2)) { 
$code = $object->code; 
$smile_url = $object->smile_url; 
$content = str_replace($code, "[img]forum/images/smiles/$smile_url[/img]", $content); 
} 

//eind smilie code
?> 


Dit is dan zonder de veranderingen die je had aangebracht. Dus wat je in je eerste post zei.

Ik denk dat dit een stuk beter is...

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024
Hmm, das inderdaad een stuk slimmer! Maar dan nog zit ik met het probleem. De code is nu alsvolgt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
//Begin smilie code 
$query2 = "SELECT * FROM zforum_smilies";  
$result2 = mysql_query($query2) or die('error making query1');  
$num_smilies = mysql_num_rows($result2);  

while ($object = mysql_fetch_object($result2)) {  
$code = $object->code;  
$smile_url = $object->smile_url;  
$c_code = '/' . $code . '*/b';
$content = preg_replace($c_code, "[img]forum/images/smiles/$smile_url[/img]", $content);  
}  
//eind smilie code


Hij geeft nu geen error meer, alleen $content is schijnbaar leeg, er word iig nix opgeslagen in de db.....

\edit, na wat gegochel (ofzo):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
//Begin smilie code 
$query2 = "SELECT * FROM zforum_smilies";  
$result2 = mysql_query($query2) or die('error making query1');  
$num_smilies = mysql_num_rows($result2);  

while ($object = mysql_fetch_object($result2)) {  
$code = $object->code;  
$smile_url = $object->smile_url;  
$c_code = "/" . $code . "\?(\s|\.|,)/";
echo "<p>$c_code</p>";
$content = preg_replace($c_code, "[img]forum/images/smiles/$smile_url[/img]", $content);  
}  
//eind smilie code 


Uit de echo komt zoiets: (natuurlijk zijn de commands anders, maar de rest is the same..)

/:D\?(\s|\.|,)/

Dat moet toch goed zijn? Ik vat et niet meer......

[ Voor 38% gewijzigd door Roa op 09-03-2003 16:53 ]

Research is what I'm doing when I don't know what I'm doing.


  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024
Goed dan, hij doet het nu alsvolgt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
//Begin smilie code 
$query2 = "SELECT * FROM zforum_smilies";  
$result2 = mysql_query($query2) or die('error making query1');  
$num_smilies = mysql_num_rows($result2);  

while ($object = mysql_fetch_object($result2)) {  
$code = $object->code;  
$smile_url = $object->smile_url;  
$c_code = "/" . preg_quote($code) . "(\s|\.|,|$)/";
$content = preg_replace($c_code, "[img]forum/images/smiles/$smile_url[/img]", $content); 
}  
//eind smilie code 


Hij doet het zoland er een punt, komma, spatie, of het einde van een string achterstaat. Helaas neemt hij de punt ook mee, en zie je dus geen punt meer na de smilie. Misschien weet iemand daar nog iets op? Ik ben het nu iig even zat :P

Research is what I'm doing when I don't know what I'm doing.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Na de <img> tag even een \$1 (of \\1) zetten. Die backreferenced naar de eerste groep haakjes ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024
huh? die snap ik niet...????

Is dat een oplossing voor het probleem dat :? al geparsed word in :?:

Research is what I'm doing when I don't know what I'm doing.


  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024
Wat bedoel je nou eigenlijk met die post???

Daarnaast zoek ik nog steeds een oplossing om te voorkomen dat de punt of komma ook meegenomen word. Weet iemand nog wat goede tuts en info over PCRE

Research is what I'm doing when I don't know what I'm doing.


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Roa schreef op 10 March 2003 @ 10:55:
Wat bedoel je nou eigenlijk met die post???

Daarnaast zoek ik nog steeds een oplossing om te voorkomen dat de punt of komma ook meegenomen word. Weet iemand nog wat goede tuts en info over PCRE
Op de website van PCRE staat een prachtige set met documentatie.
BTW. jij hebt lookahead assertions nodig. In de docs staat een uitleg daarvan.

Localhost, sweet localhost


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

drm schreef op 09 March 2003 @ 01:58:

Je zou ook nog een grammatica kunnen gaan ontwikkelen, maar da's een beetje extreem, he? :P


een grammatica is een beetje onzinnig, wat je hier nodig hebt is puur een lexical analyzer/tokenizer

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

drm:
[nohtml]Na de <img> tag even een \$1 (of \\1) zetten. Die backreferenced naar de eerste groep haakjes ;)[/nohtml]
Roa:
huh? die snap ik niet...????

Is dat een oplossing voor het probleem dat :? al geparsed word in :?:
Roa:
Wat bedoel je nou eigenlijk met die post???

Daarnaast zoek ik nog steeds een oplossing om te voorkomen dat de punt of komma ook meegenomen word. Weet iemand nog wat goede tuts en info over PCRE
Nou breekt toch echt mijn klomp. Je vraagt datzelfde een reply terug en komt er niet op om het even uit te proberen, of desnoods even verduidelijking te zoeken in een pcre manual, ofzo :? :/

Verder kan 't ook geen kwaad om even de editknop uit te proberen als je wat toe te voegen hebt aan een post :|

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1

Dit topic is gesloten.