[php] Van html naar ubb

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 06-08 15:21
Het is een beetje tegeover gestelde situatie, maar ik wil url's in html omzetten naar een soort van ubb code. Alleen snap ik het principe van eregi_replace volgens mij nog niet helemaal.
PHP:
1
2
$bericht = eregi_replace("\\<a href=\"([^\\\[]*)\\]([^\\\[]*)\" target=\"\\\">\\</a>",
"[url=\\1 target=\\2]\\3[/url]",$bericht);


Waarom werkt dit niet met bijvoorbeeld "<a href="http://www.tweakers.net/" target="_blank">test</a>"?

[ Voor 30% gewijzigd door Liqued op 17-10-2005 13:13 ]


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Volgens mij match je alleen links met een \ als link-tekst.
Zoals "<a href="http://www.tweakers.net/" target="_blank">\</a>"?

En de link-tekst zelf vang je ook niet op, dus de \\3 in je replace-string zal altijd leeg zijn.

[ Voor 59% gewijzigd door WormLord op 17-10-2005 13:17 ]


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
dat hier zowiezo geen foutmelding op komt. het eerste karakter binnen de string van het eerste argument geldt als delimter (tweede regel in de uitleg). Daar geef je nu het zelfde teken voor op als het karakter dat gebruikt wordt om speciale tekens te escapen. je kunt er beter een / van maken

[ Voor 18% gewijzigd door marty op 17-10-2005 13:26 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
In de eerste plaats gebruik je de backreferences verkeerd. Deze wijzen terug naar groepen die je definieert in het pattern middels haakjes ( ). In het target gedeelte staat niet zo'n groep, die zul je er dus niet uitvissen.

Ten tweede ziet het eruit alsof het pattern gekopieerd is van het pattern om UBB om te zetten naar een html link. Das niet erg, maar dan moet je wel proberen te begrijpen wat het in eerste instantie deed en wat je dus moet veranderen. Laten we het patern even doorlopen:

\\<a href=\"([^\\\[]*)\\]([^\\\[]*)\" target=\"\\\">\\</a>
De eerste groep. Hierin match je meermaals (door de *) een karakter dat valt binnen de klasse die wordt gedefinieerd tussen de blokhaken. Na escapen staat daar ^] oftwel elk karakter behalve een sluitende blokhaak. Wat je eigenlijk wil is dat elk karakter behalve een dubbele quote matched, dat is immers de afbakening van de href.

\\<a href=\"([^\\\[]*)\\]([^\\\[]*)\" target=\"\\\">\\</a>
Na de eerste groep komt er volgens jou een blokhaak. denk niet dat die in een url staat. Hence geen match. Wat hier wel zou moeten staan is een dubbele quote en een spatie. Dat zijn immers de karakters die na de inhoud van een href attribuut staan.

"\\<a href=\"([^\\\[]*)\\]([^\\\[]*)\" target=\"\\\">\\</a>"
Een nieuwe groep, de karakterklasse is hetzelfde als binnen de href. Alles behalve een "]" matched hier dus. Wat je ermee wil bereiken weet ik niet. Maar we hebben hem hier niet nodig.

"\\<a href=\"([^\\\[]*)\\]([^\\\[]*)\" target=\"\\\">\\</a>"
Om een backreference te genereren gebruik je geen "\\". Daarvoor moet je een subpattern definiëren, dat is wat ik hierboven steeds aanduidde als een groep. Dat wil zeggen haakjes openen en melden wat er moet matchen.

Hoe moet ie dus wel:
PHP:
1
2
3
$pattern = "\\<a href=\"([^\"]*)\" target=\"([^\"]*)\">([^\<]*)</a>";
$replace = "[url href=\\1 target=\\2]\\3[/url]";
eregi_replace($pattern,$replace, $bericht);

[ Voor 29% gewijzigd door T-MOB op 17-10-2005 13:44 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 06-08 15:21
tnx. begin het eindelijk een beetje door te krijgen. heb alleen nog wat raars waar ik tegen aan loop. Ik heb een string:
code:
1
<font size="3"><font face="Times New Roman">string</font></font>


Die probeer ik dus ook de "<font size"3"> om te zetten met de volgende code:
PHP:
1
2
$bericht = eregi_replace("\\<font size=\"([^\\\[]*)\">",
"[fontsize=\\1]",$bericht);


Maar dan krijg ik het volgende er uit:
code:
1
[fontsize=3"><font face="Times New Roman]string[/font][/font]


Hoe komt het dat ie niet de eerste "> pakt die, die tegen komt?

Acties:
  • 0 Henk 'm!

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Omdat je wederom op alles behalve een [ matched in je eerste matchblok

[voorkauwmodus]
code:
1
<font face="Times New Roman">string</font>

PHP:
1
preg_replace('/<font size="([^"]+)">(.*?)<\/font>/i', "[fontsize=\\1]\\2[/font]", $subject);

[/voorkauwmodus]

[ Voor 94% gewijzigd door GX op 17-10-2005 15:14 ]

Pagina: 1