[PHP] rn en \r\n vervangen met regular expression

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
In een hele bult content (in een db) zijn na conversie de volgende tekenreeksen blijven staan

\r\n
rn


Deze moeten vervangen worden door niets.
De rn komt altijd voor in deze combinatie > 1 of meer spaties rn 1 of meer spaties <
Dus bijvoorbeeld <span> rn </span>

Ik heb een poging gedaan met de volgende regular expression

'/(?:(>))*.rn*.(?:(<))/'

Probleem is dat als ik deze met PHP preg_replace gebruik in mijn tekst
<bold> rn </bold> vervangen wordt door <bold /bold> ipv <bold></bold>
Ik heb de tut op regularexpressions.info gelezen en het pakket regexbuddy gekocht en geprobeerd, maar kom er niet uit.

[ Voor 3% gewijzigd door Verwijderd op 15-12-2008 16:08 ]


Acties:
  • 0 Henk 'm!

  • Thomson
  • Registratie: Februari 2003
  • Laatst online: 02-01 10:11
Helpt in de replace '><' zetten niet?

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Als je puur \r\n of rn wilt vervangen kan je toch prima een str_replace o.i.d. gebruiken? Daar heb je geen regexp voor nodig.

Tenzij er eisen zijn aan welke rn je wel of niet mag vervangen. In dat geval zou ene regexp handiger kunnen zijn (maar dat hoeft niet ;) ).

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:07

TeeDee

CQB 241

* TeeDee wijst ook nog maar even naar je signature.

Ik zou in ieder geval ook je DB op orde proberen te krijgen.

[ Voor 4% gewijzigd door TeeDee op 15-12-2008 16:15 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 21-09 16:37

Basszje

Reisvaap!]

Creepy schreef op maandag 15 december 2008 @ 16:10:
Als je puur \r\n of rn wilt vervangen kan je toch prima een str_replace o.i.d. gebruiken? Daar heb je geen regexp voor nodig.
Lijkt mij niet zo handig als er ook tekst in de dataset voorkomt zoals "urn" :P

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op maandag 15 december 2008 @ 16:07:
Ik heb een poging gedaan met de volgende regular expression

'/(?:(>))*.rn*.(?:(<))/'
Wat zou *. moeten doen? En vanwaar de gekke combinatie "(?:(...))"?
Ik heb de tut op regularexpressions.info gelezen en het pakket regexbuddy gekocht en geprobeerd, maar kom er niet uit.
Heb je ook gekeken naar deze pagina over look-ahead/-behind?

[ Voor 27% gewijzigd door pedorus op 15-12-2008 16:17 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Creepy schreef op maandag 15 december 2008 @ 16:10:
Als je puur \r\n of rn wilt vervangen kan je toch prima een str_replace o.i.d. gebruiken? Daar heb je geen regexp voor nodig.

Tenzij er eisen zijn aan welke rn je wel of niet mag vervangen. In dat geval zou ene regexp handiger kunnen zijn (maar dat hoeft niet ;) ).
offtopic:
Heerlijk, die ondertitel van je d:)b

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
pedorus schreef op maandag 15 december 2008 @ 16:16:
[...]

Wat zou *. moeten doen? En vanwaar de gekke combinatie "(?:(...))"?

* staat voor 1 of meer, spaties in dit geval
(?:) is een passive groep, hiermee hoopte ik de < en > te excluden van vervanging


[...]

Heb je ook gekeken naar deze pagina over look-ahead/-behind?

Nee, hier heb ik niet naar gekeken. Ik ga dit nu doen. Ik heb dit inmiddels wel gedaan, maar dit maakt het alleen maar complexer. Ik begrijp dat je een teken kunt excluden, maar wat nu als je niet weet of dat volgende teken er komt, wat het is en waar het staat. Ik onderschrijf i.i.g. de conclusie dat als je een probleem wilt oplossen met een regex, je met 2 problemen minstens 3 problemen komt te zitten. Tsjee wat nodeloos ingewikkeld
Je zou denken dat '>*\wrn<' toch zou moeten werken. Wie verzint zoiets, ja ik zie het al ene Henri Spencer. Die heeft vast gedacht "Waarom makkelijk doen als het ook moeilijk kan" :(

[ Voor 20% gewijzigd door Verwijderd op 15-12-2008 16:41 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Wil je niet gewoon ' rn' vervangen door ' '. En vervolgens '\r\n' door ''? Nogmaals: geen regexp voor nodig :P

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Creepy schreef op maandag 15 december 2008 @ 16:38:
Wil je niet gewoon ' rn' vervangen door ' '. En vervolgens '\r\n' door ''? Nogmaals: geen regexp voor nodig :P
Iets beter lezen... ik wil rn alleen vervangen al het na een > staat en voor een < met een willekeurig aantal spaties tussen de > en rn en <
Met str_replace vervang ik ook een woord als internet door inteet en dat is niet de bedoeling

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:07

TeeDee

CQB 241

Let op de spatie voor de ' rn' ;)

Goed, het is niet 200% waterdicht, maar ik denk dat je daar al behoorlijk ver mee komt.

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op maandag 15 december 2008 @ 16:43:
[...]

Iets beter lezen... ik wil rn alleen vervangen al het na een > staat en voor een < met een willekeurig aantal spaties tussen de > en rn en <
Met str_replace vervang ik ook een woord als internet door inteet en dat is niet de bedoeling
In je startpost meld je dat hele verhaal niet en zie inderdaad de ' rn' (dus met spatie ervoor :P ).

Wat ik me wel afvraag: Hoe kom je tot een staat waarin je en \r\n in je content hebt staan en ook rn? Heb je niet nog ergens een backup waar je nog een beetje normale content hebt (dus alleen \r\n of iets dergelijks) zodat je je probleem met alleen rn kan omzeilen?

Als er altijd een spatie voor en achter rn staat is het nog makkelijker natuurlijk: ' rn ' laten vervangen met een str_replace. Mocht je dan nog hebben dat er de mogelijkheid bestaat dat het precies tussen twee tags in staat dan is het ook makkelijk '>rn<' vervangen door '><'. Twee keer een str_replace nodig i.p.v. een regexp. Wat mij betreft nog steeds veel beter leesbaar en onderhoudbaar.

En anders iets van een "\>[:space:]*rn[:space:]*\<" laten vervangen door '><' (note: totaal uit de losse pols geschud en ongetest)

[ Voor 26% gewijzigd door Creepy op 15-12-2008 17:20 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • tonyisgaaf
  • Registratie: November 2000
  • Niet online
Verwijderd schreef op maandag 15 december 2008 @ 16:07:
[...]
De rn komt altijd voor in deze combinatie > 1 of meer spaties rn 1 of meer spaties <
Dus bijvoorbeeld <span> rn </span>
[..]
Ik snap niet wat je doet in je eigen RegExp, want er klopt niet al te veel van.
Als je het nu eens systematisch benadert:
  • >
  • minimaal één white-space
  • rn
  • minimaal één white-space
  • <
Je hoeft niets te capturen, want je weet al dat je "><" terug moet plaatsen.
Dus wat het enige afwijkende wat je hoeft op te zoeken in de documentatie is:
  • Hoe match ik een white-space?
  • Hoe match ik "minimaal één"?
Dan wordt dat toch een vrij eenvoudige RegExp? Ik vind overigens dat bij deze (eenmalige) opschoning van een DB een RegExp prima toepasbaar is.

NL Weerradar widget Euro Stocks widget Brandstofprijzen widget voor 's Dashboard


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Creepy schreef op maandag 15 december 2008 @ 17:01:
En anders iets van een "\>[:space:]*rn[:space:]*\<" laten vervangen door '><' (note: totaal uit de losse pols geschud en ongetest)
Meer '/(?<=>) *+rn *+(?=<)|\\\\r\\\\n/' naar '' lijkt mij.
tonyisgaaf schreef op maandag 15 december 2008 @ 17:21:
Dan wordt dat toch een vrij eenvoudige RegExp? Ik vind overigens dat bij deze (eenmalige) opschoning van een DB een RegExp prima toepasbaar is.
De situatie is wel erg verdacht anders, zoals Creepy al aangeeft :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

pedorus schreef op maandag 15 december 2008 @ 17:32:
[...]

Meer '/(?<=>) *+rn *+(?=<)|\\\\r\\\\n/' naar '' lijkt mij.
Waarom precies? :) ">\s*rn\s*<" vervangen door "><" en daarna een normale string replace voor de \r\n werkt toch ook? Bovendien is het leesbaarder. :)

[ Voor 8% gewijzigd door NMe op 15-12-2008 17:49 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
NMe schreef op maandag 15 december 2008 @ 17:48:
[...]

Waarom precies? :) ">\s*rn\s*<" vervangen door "><" en daarna een normale string replace voor de \r\n werkt toch ook? Bovendien is het leesbaarder. :)
Beetje kort door de bocht inderdaad. Het in ieder geval beter omdat het [[:space:]] is, waardoor die andere oplossing niet werkt. "*+" kan iets sneller zijn (zeker geen backtracking), en < en > hoef je niet te escapen. Leesbaarheid lijkt me niet zo'n issue voor iets dat je hopelijk eenmalig doet ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

pedorus schreef op maandag 15 december 2008 @ 17:32:
[...]

Meer '/(?<=>) *+rn *+(?=<)|\\\\r\\\\n/' naar '' lijkt mij.
Niet (helemaal) mee eens. In html kunnen ook prima tabs als whitespace worden gebruiken, dus vandaar de [:space:] \s is een shortcut voor [:space:]. Daarnaast zou ik de matching groups met > en < niet gebruiken zodat ze wel worden vervangen en vervolgens vervangen door '><'. Wat mij betreft is dat wat leesbaarder. Over snelheid hoeven we het niet te hebben aangezien het een eenmalige actie is. Als het echt geen eenmalige actie is dan heeft de TS een groter probleem :P

Maar als de TS zegt dat er altijd minimaal 1 spatie voor en minimaal 1 spatie achter de rn zit dan is de regexp helemaal niet nodig en zou ik die extra whitespace die in HTML toch geen nut heeft vrolijk laten staan. Dus een str_replace met ' rn ' is dan voldoende.

[ Voor 14% gewijzigd door Creepy op 15-12-2008 20:02 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Creepy schreef op maandag 15 december 2008 @ 19:57:
Niet (helemaal) mee eens. In html kunnen ook prima tabs als whitespace worden gebruiken, dus vandaar de [:space:]
Mee eens dat je andere whitespace (zoals enters) kan gebruiken, ik weet niet waarom je het hebt doorgehaald. Enkel weten we de exacte vervuiling niet waardoor dat gokken is natuurlijk.
\s is een shortcut voor [:space:].
Je kan [:space:] dus alleen binnen [] kan gebruiken, waardoor het dus [[:space:]] wordt bij direct gebruik. Maar er is ook nog een verschillend karakter \xk, oftewel vertical tab (0xB, 11d, "\x0B" in PHP). Hoe die werkt hangt af van de exacte versies, in principe matched \s hem niet en [[:space:]] hem wel.
Daarnaast zou ik de matching groups met > en < niet gebruiken zodat ze wel worden vervangen en vervolgens vervangen door '><'. Wat mij betreft is dat wat leesbaarder.
Klopt, enkel waarschijnlijk minder efficiënt. Ik dacht even dat er een regex gezocht werd voor beide acties in 1x, maar dat is natuurlijk niet zo.
Over snelheid hoeven we het niet te hebben aangezien het een eenmalige actie is.
Hangt er vanaf om hoeveel data het gaat natuurlijk ;)
Als het echt geen eenmalige actie is dan heeft de TS een groter probleem :P
Helemaal mee eens :P

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1