[PHP/preg_replace] Stopt bij verkeerde teken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik probeer een tekst als http://www.bla.com/?email=bla@bla.com te vervangen door een html link. Ik krijg echter niet voor elkaar dat het teken @ wordt meegenomen bij de replace.

De code:

$Line = preg_replace('/\b( |^|\b)((http(s?):\/\/)|(www\.))([\w\.]+)([\/\w+\.\-\?\&\=]+)\b/i','$1<a href="http$4://$5$6$7" target="_blank">$3$4$5$6$7</a>', $Line);

suggesties?

Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Weet niet zeker hoor, maar misschien moet je dit:
'/\b( |^|\b)((http(s?):\/\/)|(www\.))([\w\.]+)([\/\w+\.\-\?\&\=]+)\b/i'
vervangen door:
'/\b( |^|\b)((http(s?):\/\/)|(www\.))([\w\.]+)([\/\w+\.\-\?\&\=\@]+)\b/i'

Of je de @ moet escapen weet ik niet zeker.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nou, als ik er gewoon \@ bij zet doet ie dus niet. Hoe escape je zo'n teken dan?

Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Verwijderd schreef op 23 januari 2003 @ 23:33:
nou, als ik er gewoon \@ bij zet doet ie dus niet. Hoe escape je zo'n teken dan?
Door de \ ervoor te zetten.

Probeer ipv \@ gewoon @ op dezelfde plaats toe te voegen.

[ Voor 14% gewijzigd door jelmervos op 23-01-2003 23:38 ]

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
\\@ deed het ook niet nee, ik dacht dat je iets anders bedoelde met escapen (ik ben niet echt thuis in perl)

Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Verwijderd schreef op 23 januari 2003 @ 23:38:
\\@ deed het ook niet nee, ik dacht dat je iets anders bedoelde met escapen (ik ben niet echt thuis in perl)
Zie mijn vorige post en probeer dat eens.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Helaas geen resultaat...

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Ik heb het getest met \@ toevoegen en dat werkt gewoon; verder maakt het niet uit of je 'm escaped of niet, het is geen speciaal karakter binnen een regexp dus het hoeft niet. Als je toch bezig bent, voeg dan ook meteen de ~ (tilde) toe :)

Intentionally left blank


Acties:
  • 0 Henk 'm!

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

drm

f0pc0dert

[nohtml]
code:
1
2
3
4
5
6
7
8
9
10
11
/
  \b
    ([ ]|^|\b)
    (
       (http(s?):\/\/)
      |(www\.)
    )
    ([\w\.]+)
    ([\/\w+\.\-\?\&\=]+)
  \b
/ix

Ik moet zeggen dat ik 't een behoorlijk aparte regex vind:
  • Waarom die \b aan het begin? Je noemt 'm ook al in de subexpressie daarna :?
  • waarom escape je de punt, het vraagteken, het ampersand en de = in de laatste supexpressie, terwijl 't een class betreft, waarin je, als je 't goed indeelt, praktisch nooit hoeft te escapen :?
  • waarom de \b aan het eind? Als je die wilt verplichten, waarom vervang je de subexpressie daarvoor dan niet door \B+ :?
  • waarom zet je een \w in een character class :?
  • Waarom assert je in de eerste subexpressie op het begin van de string (^), maar aan het eind van de regex niet op het eind van de string? ($)
en zo kan ik eigenlijk nog wel even door gaan. Kortom, ik heb het vermoeden dat je nog eens wat beter na moet gaan denken over deze regex, en misschien even wat naar manuals c.q. tutorials moet gaan zoeken, ofzo.

[ Voor 1% gewijzigd door drm op 24-01-2003 01:29 . Reden: wtf ^) FOK icon galore :o ]

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


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

drm: iets soortgelijks staat bij de comments in de php reference, ik vermoed dat TS het daar vandaan heeft.
Ook voor mij zijn regexes vaak ook trail-and-error dingetjes waar ik achteraf nog veel aan sleutel. Het algemene probleem is dat veel tutorials te weinig voorbeelden geven van wat ingewikkeldere regexes met duidelijke uitleg, of botweg foute voorbeelden bevatten.

Zo heb ik me blind lopen staren op de volgende:

code:
1
!\\[b\]((.|\n)*?)\\[/b\]!


Ik weet nog steeds niet waar die ! in het begin en het eind voor staan, maar neem aan dat het een alternatief is voor /
Uiteindelijk heb ik er dit van gemaakt:

code:
1
/\[b](.+)\\[\/b]/Uis


In elk geval zijn jouw opmerkingen wel zeer verhelderend :)

[ Voor 38% gewijzigd door crisp op 24-01-2003 09:05 ]

Intentionally left blank

Pagina: 1