[PHP] Regex van UBB code werkt half.. :/

Pagina: 1
Acties:

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Hoi,

Ik wil bij mijn forum bepaalde smiley code vervangen voor een image, dus bijvoorbeeld : en ? wordt dan mijn :?
Ik heb de volgende code:
code:
1
2
3
4
    $Str = ':? :?';
    echo preg_replace( '/(^|[\s\n]):\?([\s\n]|$)/m', '\\1question\\2', $Str);
    // Ook dit geprobeerd:
    // echo ereg_replace( '(^|[^a-zA-Z0-9])(:\?)([^a-zA-Z0-9]|$)', '\\1question\\3', $Str);

Het probleem is hier dat alleen de eerste smiley wordt geparsed, en de tweede niet. Maar als ik er een derde aan toevoeg, dan werkt het weer wel :? Simpelweg een spatie erachter werkt niet, ik heb eigenlijk geen flauw idee waar het mis zou kunnen gaan, vooral omdat een derde wel weer werkt.
De bedoeling is dat alleen smileys aan het begin of einde van een regel staan of tussen spaties in geparsed worden...

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Kijk eens naar str_replace. Veel makkelijker en nog sneller ook! :P

On track


  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Maar str_replace vervangt alles. En dat wil ik dus niet. Als je bijvoorbeeld in een zin ee:?n zou typen, wil ik niet dat het wordt vervangen... en dat gebeurd met str_replace wel.

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


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

kvdveer

Z.O.Z.

Ik zie niet waarom je jezelf plaagt met die multiline onzin...

Ik stel dit voor:
/(?<=(\s|^)):\?(?=(\s|$))/

Kijk even in de PCRE syntax onder Assertions (hier)

Localhost, sweet localhost


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Hmm.. zit wat in :) Je wilt dus voor een een smilie een whitespace of begin van een regel? en daarna ook?

Wordt het dan niet ongeveer
preg_replace( '/(^|\s):\?(\s|$)/', '\\1question\\2', $Str) ?

[ Voor 0% gewijzigd door WouZz op 20-08-2002 23:51 . Reden: vervelende highlight bug :( ]

On track


  • SAiKO
  • Registratie: September 2000
  • Laatst online: 12-05 12:34

SAiKO

Grote Smurf

Kun je niet str_replace pakken en dan ' :? ' (of moet dat met [:space:] ?) gebruiken?

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
WouZz schreef op 20 augustus 2002 @ 23:49:
Hmm.. zit wat in :) Je wilt dus voor een een smilie een whitespace of begin van een regel? en daarna ook?

Wordt het dan niet ongeveer
preg_replace( '/(^|\s):\?(\s|$)/', '\\1question\\2', $Str) ?
Geprobeerd, zelfde probleem... :/
SAiKO schreef op 20 augustus 2002 @ 23:51:
Kun je niet str_replace pakken en dan ' :? ' (of moet dat met [:space:] ?) gebruiken?
maar dan moet ik dus in totaal drie keer str_replace doen, per smiley vorm... ik heb nu al een hele waslijst aan patterns die een smiley kunnen vormen, en als ik dat nog eens drie keer moet doen .. zie ik eigenlijk niet zo zitten :/


-Edit-
Ik had trouwens ook nog dit geprobeerd:
code:
1
echo preg_replace( '/(\b):\?(\b)/', '\\1question\\2', $Str);

Zonder enig resultaat overigens.
kvdveer schreef op 20 augustus 2002 @ 23:43:
Ik zie niet waarom je jezelf plaagt met die multiline onzin...

Ik stel dit voor:
/(?<=(\s|^)):\?(?=(\s|$))/

Kijk even in de PCRE syntax onder Assertions (hier)
Ik snap niet 100% wat hier eigenlijk staat... maar da's toch nu niet het geval? Ik wil in principe niks met multilines te maken hebben, wil alleen maar weten of iets aan het begin van een regel staat, of dat er een spatie voor staat, zelfde verhaal eigenlijk aan de achterkant...

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • sjokki
  • Registratie: Juli 2002
  • Niet online
kvdveer schreef op 20 augustus 2002 @ 23:43:
Ik stel dit voor:
/(?<=(\s|^)):\?(?=(\s|$))/
Deze gaat mis omdat \s|^ binnen haakjes staat. Een groep binnen Lookbehind mag alleen 'fixed length' zijn. ^ is korter dan \s.

Dit kan wel

(?<=\s|^)

En dit ook

(?<!\S)

Beiden hebben hetzelfde effect.
WouZz schreef op 20 augustus 2002 @ 23:49:Wordt het dan niet ongeveer
preg_replace( '/(^|\s):\?(\s|$)/', '\\1question\\2', $Str) ?
Lookbehind en lookahead matchen niets dus \1 en \2 bestaan niet.

Dus zo werkt ie wel:
code:
1
$Str = preg_replace('/(?<!\S):\?(?!\S)/', 'question', $Str);



Edit : ik zie nu dat ik de post van WouZz helemaal niet goed gelezen heb... Je gebruikt helemaal geen lookahead en behind, sorry..

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
sjokki schreef op 21 augustus 2002 @ 00:29:
Dus zo werkt ie wel:
code:
1
$Str = preg_replace('/(?<!\S):\?(?!\S)/', 'question', $Str);
Jeetje, het werkt inderdaad :) * ^Mo^ is weer helemaal blij
Maar wat staat hier nu precies? Ik begrijp het nog niet helemaal hoor..
je kijkt eerst of het vorige(?) character een whitespace is (of eigenlijk niet "alles behalve whitespace")dan de smiley, en dan kijken of het volgende character niet "alles behalve whitespace" is...? Maar newlines en begin van regels behoren toch niet tot whitespaces? Dus die zouden moeten matchen met \S .. of begrijp ik het nu helemaal verkeerd?

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • sjokki
  • Registratie: Juli 2002
  • Niet online
_Mo_ schreef op 21 augustus 2002 @ 00:40:
[...]

Jeetje, het werkt inderdaad :) * sjokki is weer helemaal blij
Maar wat staat hier nu precies? Ik begrijp het nog niet helemaal hoor..
je kijkt eerst of het vorige(?) character een whitespace is (of eigenlijk niet "alles behalve whitespace")dan de smiley, en dan kijken of het volgende character niet "alles behalve whitespace" is...? Maar newlines en begin van regels behoren toch niet tot whitespaces? Dus die zouden moeten matchen met \S .. of begrijp ik het nu helemaal verkeerd?
Je kunt het zien als een regular expression in een regular expression. Als die smiley aan het begin van een string staat wordt deze regular expression uitgevoerd:
code:
1
preg_match('/\S/','')
Deze geeft 'false' terug en dat is goed.

Een newline is wel degelijk whitespace.

\s = [\ \t\r\n\f]

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
jaaaja, 'tis eigenlijk nog best simpel als het zo bekijkt :) In ieder geval, hartstikke bedankt voor je hulp en alle anderen ook voor hun inbreng :)

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs

Pagina: 1