[PHP] UBB tag werkt niet goed

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 17:03

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Topicstarter
Okee, allereerst wat al werkt:

PHP:
1
$text = preg_replace("/<a href='search.php?\show=topicbod\y&term=(.*)'>(.*)<\/a>/Uis", "[search=\\1]", $text);

Wanneer je dus een bepaalde search link post, dan wordt het omgezet naar:
PHP:
1
"/\[search=(.*)\]/Uis",

En dat wordt dan uiteindelijk:
PHP:
1
"<a href='search.php?show=bodysearch&term=\\1'>Zoeken naar: \\1</a>",


Voorbeeld hoe het er dan uitziet: Iemand post http://www.mijnsite.nl/se...odysearch&term=dezoekterm en dat wordt dan Zoeken naar: dezoekterm

Werkt prima zo :)

Nu nog een tag die daar een beetje op lijkt

PHP:
1
$text = preg_replace("/<a href='topic.php?id=(.*)'>(.*)<\/a>/Uis", "[topic=\\1]", $text);


Dus wanneer je een bepaald topic post, wordt het omgezet naar:
PHP:
1
"/\\[topic=([0-9]{0,5})\]/Uis",

En dat wordt weer omgezet naar
PHP:
1
"topicid2topictitle('\\1')",


En die functie roept het topic titel op en werkt prima

Wanneer iemand dus http://www.mijnsite.nl/topic.php?id=1 intypt, zou het Dit is het titel van het topic moeten worden.

Helaas werkt dit dus niet. Het ligt niet aan de function topicid2topictitle($id) , want als je het volgende typt
code:
1
[topic=1]


werkt de functie prima en krijg je netjes Dit is het titel van het topic

Alleen wanneer je http://www.mijnsite.nl/topic.php?id=1 typt, blijft dit staat :(

Omdat de functies bijna hetzelfde zijn, kan het denk ik alleen maar liggen aan het feit dat bij de topic parse functie

PHP:
1
"topicid2topictitle('\\1')",


een verwijzing wordt gedaan naar een ander gedeelte van het php bestand en bij de search functie niet. Ik dacht dat dit geen probleem mocht zijn, maar dit is het enige wat ik kan bedenken wat fout gaat. En hoe op te lossen, geen idee helaas :)

Ik heb ook het volgende geprobeerd voor de zekerheid, maar dat werkt ook niet en bij de search functie is het ook niet nodig.
PHP:
1
2
3
<?
$text = preg_replace("/<a href='http://localhost/topic.php?id=(.*)'>(.*)<\/a>/Uis", "[topic=\\1]", $text);
?>


Dus voor de duidelijkheid, http://localhost/ toegevoegd :+

[ Voor 52% gewijzigd door We Are Borg op 18-03-2003 18:00 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Je regexp zoekt naar <a href='topic.php?id=1'> terwijl je <a href='http://www.mijnsite.nl/topic.php?id=1'> in je bericht hebt staan. Misschien dat het daarom niet gevonden wordt? ;)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 17:03

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Topicstarter
Bij
PHP:
1
<a href='search.php?\show=topicbod\y&term=(.*)'>(.*)<\/a>/Uis", "[search=\\1]", $text);

geeft dit geen probleem ;) Maar zie ook mijn edit, heb het voor de zekerheid geprobeerd en maakte helaas geen verschil :) Het draait hier wel @ localhost, maar dat mag toch geen probleem zijn denk ik zo ;)




Ik merk toch dat het foutje zit in de preg_replace

PHP:
1
2
$text = preg_replace("/<a href='search.php?\show=topicbod\y&term=(.*)'>(.*)<\/a>/Uis", "[search=\\1]", $text);
$text = preg_replace("/<a href='topic.php?id=(.*)'>(.*)<\/a>/Uis", "[blaat=\\1]", $text);


De eerste werkt en de 2de niet. Heb er even [blaat=\\1] van gemaakt om te testen of het aan de
code:
1
[topic=\\1]
functie lag.

Het volgende geprobeerd:

PHP:
1
$text = preg_replace("/<a href='topic.php?\id=(.*)'>(.*)<\/a>/Uis", "[blaat=\\1]", $text);


Extra slash zoals bij search ook gedaan, helpt niks. Heb ook http://localhost/ toegevoegd, mocht ook niet baten.

Dus http://localhost/topic.php?id=1 blijft zo en wordt niet [blaat=1]. Zodra het dat wordt, kan ik het veranderen in
code:
1
[topic=\\1]
, maar eerst moet het eerste stapje goed gaan :)

Topic.php (misschien dat het nuttig is ;) :

Hmm, uploaden gaat niet helemaal lekker, topic.php is HIER te downloaden

[ Voor 156% gewijzigd door We Are Borg op 17-03-2003 13:42 ]


Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 17:03

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Topicstarter
* We Are Borg geeft een kick hard omhoog :)

Is dit een te moeilijke vraag :P ?

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Vergeet je niet gewoon dat de ? een speciaal karakter is :?

code:
1
/^topic.php?$/
zou bijvoorbeeld matchen op "topic.ph" of "topic.php" maar niet op "topic.php?". (Ik heb de begin of string (^) en end of string ($) assertions even toegevoegd om verwarring te voorkomen...).

't Lijkt in de 2 bovenstaande regular expressions er op dat je de ? probeert te escapen door een \ erachter te zetten, terwijl die er volgens mij voor moet.

In het geval van je 'search.php' levert dit iets vreemds op:
code:
1
/search.php?\show/
De '?' betekent in dit geval: "die p die voor mij staat hoeft niet perse"
de '\s' betekent "Hier moet een whitespace character komen"...
en 'how' betekent gewoon match-self "how".

't Ontgaat mij een beetje waarom die search-pattern wel werkt, maar misschien dat je hier iig wat aan hebt :)

edit:
Overigens: iets dergelijks treedt op met de '.' (punt).

Een punt in een regular expression betekent dat op die plek "any character" mag staan. Afhankelijk van de 's' modifier (na je laatste delimiter) is dit inclusief of exclusief newline character. s betekent "dot-all", inclusief newline dus

Als je de metacharacter (speciale character) '.' of '?' dus wilt "omzetten" in een match-self character moet je 'm escapen, net als alle andere metacharacters (er zijn wat uitzonderingen, maar daar zal ik je niet mee vermoeien ;))

[ Voor 25% gewijzigd door drm op 18-03-2003 17:01 ]

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


Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 17:03

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Topicstarter
drm schreef op 18 maart 2003 @ 16:57:
Vergeet je niet gewoon dat de ? een speciaal karakter is :?

code:
1
/^topic.php?$/
zou bijvoorbeeld matchen op "topic.ph" of "topic.php" maar niet op "topic.php?". (Ik heb de begin of string (^) en end of string ($) assertions even toegevoegd om verwarring te voorkomen...).
Klopt, dat het ik idd niet bedacht :)
't Lijkt in de 2 bovenstaande regular expressions er op dat je de ? probeert te escapen door een \ erachter te zetten, terwijl die er volgens mij voor moet.

In het geval van je 'search.php' levert dit iets vreemds op:
code:
1
/search.php?\show/
De '?' betekent in dit geval: "die p die voor mij staat hoeft niet perse"
de '\s' betekent "Hier moet een whitespace character komen"...
en 'how' betekent gewoon match-self "how".
Dit is nogmaal de regel

PHP:
1
$text = preg_replace("/<a href='search.php\?show=topicbod\y&term=(.*)'>(.*)<\/a>/Uis", "[search=\\1]", $text);


Deze werkt helaas ook niet. Ik heb dat verkeerd aangeven, mijn fout. Wat wel werkt is wanneer iemand
code:
1
[search=zoekterm]
intypt dat het automatisch verwerkt wordt naar een search actie. Iets totaal anders dus, heb ik verkeerd aangegeven ;)
't Ontgaat mij een beetje waarom die search-pattern wel werkt, maar misschien dat je hier iig wat aan hebt :)
Vervalt dus :+
edit:
Overigens: iets dergelijks treedt op met de '.' (punt).

Een punt in een regular expression betekent dat op die plek "any character" mag staan. Afhankelijk van de 's' modifier (na je laatste delimiter) is dit inclusief of exclusief newline character. s betekent "dot-all", inclusief newline dus

Als je de metacharacter (speciale character) '.' of '?' dus wilt "omzetten" in een match-self character moet je 'm escapen, net als alle andere metacharacters (er zijn wat uitzonderingen, maar daar zal ik je niet mee vermoeien ;))
Vermoeien doe je niet, leer er van ;).

Ik heb er wel iets aan, maar weet nog niet hoe ik er omheen kom :)

Als iemand namelijk een topic link post is het dus http://localhost/topic.php?id=2 (dat localhost is tijdelijk, maar het gaat im het
code:
1
/topic.php?id=2


Zonder die vraagteken werkt de url dus niet. Ik snap nu dat in $text = preg_replace die "?" iets anders betekend, maar hij moet er wel in blijven ;)

[ Voor 21% gewijzigd door We Are Borg op 18-03-2003 17:39 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

vergeet trouwens niet dat je de backslashes zelf ook moet escapen, aangezien php ze anders gaat omzetten (dit zal voor de meeste dingen niet uitmaken, maar het getuigd niet echt van goede code-stijl als je het niet doet)

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.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Feitelijk is het gedeelte 'http://localhost/' dus irrelevant, gezien dat simpelweg de locatie van het forum aangeeft? Dan zou ik daar een constante van maken en aan de hand daarvan je regexen genereren

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
define ( 'FORUM_URL', 'http://localhost/' );

$gPcreForumUrl = preg_quote ( FORUM_URL );

// ...
$pcre_replace = array (
   '~<a href="(' . $gPcreForumUrl . '|/)?topic\.php\?id=([0-9]+)[^>]>.*?</a>~s' 
      => '[topic=$2]',
   '~<a href="(' . $gPcreForumUrl . '|/)?search\.php\?.*?term=(.*?)("|&)[^>]*>.*?</a>~s'
      => '[search=$2]'
);
$str = preg_replace ( array_keys ( $pcre_replace ), array_values ( $pcre_replace ), $str );

Iets dergelijks. Even losse pols werk, maar zoiets zou volgens mij aardig moeten werken :?

edit:
vergeet trouwens niet dat je de backslashes zelf ook moet escapen, aangezien php ze anders gaat omzetten (dit zal voor de meeste dingen niet uitmaken, maar het getuigd niet echt van goede code-stijl als je het niet doet)

Als je single quotes gebruikt, maakt dat niet uit. Dan hoef je enkel de ' te escapen, bij de rest fungeert de \ gewoon als backslash-character :)

[ Voor 21% gewijzigd door drm op 18-03-2003 18:00 ]

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


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

drm schreef op 18 maart 2003 @ 17:59:
Als je single quotes gebruikt, maakt dat niet uit. Dan hoef je enkel de ' te escapen, bij de rest fungeert de \ gewoon als backslash-character :)


ik zie m toch echt gebruik maken van double quotes ;)
bovendien moet je bij single quotes de backslash zelf ook nog escapen :P

[ Voor 11% gewijzigd door .oisyn op 18-03-2003 18:03 ]

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.


Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 17:03

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Topicstarter
Thanks drm voor het voorbeeldje (en .oisyn ook thx ;) ). Ik het het klein beetje aangepast om het goed te maken + kleine typo naar mijn mening :) De functie ziet er voor de rest super uit, maar werken ho maar. Het lijkt me sterk, maar misschien pas ik het verkeerd toe.

http://www.planet.nl/~terps407/main.zip

Zo ziet het er nu uit in de file :) Misschien dat ik wat fout doe ofzo, of iets verkeerd heb aangepast aan jouw voorbeeld, maar krijg geen errors en tekst blijft helaas staan, terwijl je voorbeeld zou moeten werken naar mijn mening :)

[sub] Het maar ff gezipped en @ planet gezet, code is te groot voor posten ;). Regel 365 begint het.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

.oisyn:
ik zie m toch echt gebruik maken van double quotes ;)
Klopt, vandaar de 'als' ;)
bovendien moet je bij single quotes de backslash zelf ook nog escapen :P

Nee hoor, dat hoeft maar in 1 geval, en dat is wanneer je een backslash voor een single quote wilt:

php.net/manual/Strings/Single quoted
To specify a literal single quote, you will need to escape it with a backslash (\), like in many other languages. If a backslash needs to occur before a single quote or at the end of the string, you need to double it. Note that if you try to escape any other character, the backslash will also be printed! So usually there is no need to escape the backslash itself.

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


Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 17:03

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Topicstarter
Als ik het zo lees en de link bekijk heft drm gelijk, maar ik hou me er buiten ;)

Ik snap alleen nog niet waarom het voorbeeld van jou (en ik dan klein beetje aangepast) niet werkt. Zie ook 1 post van mij terug. Ben nu weer er mee bezig, maar krijg het niet werkend :(

Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 17:03

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Topicstarter
[steve urkel modus]

did I do that :P

[/steve urkel modus]

[rml]We Are Borg in "[ PHP] UBB tag werkt niet goed"[/rml]

Ben er nog steeds niet uit. Wat ik ook voor kleine aanpassingen maak, het wil niet werken. Zie ook dit linkje hierboven ;)

Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 17:03

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Topicstarter
Geeft nog 1 keer een harde schop tegen dit topic aan :)
Pagina: 1