[regexp] probleem met search & replace

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Goner
  • Registratie: Mei 2002
  • Laatst online: 20-09 11:26

Goner

What can I do you for ?

Topicstarter
Ik probeer met InfoRapid Search & Replace een hele berg .xml files te doorzoeken op & (ampersand) en te vervangen door ' en ' (bijv. om Oorlog&Vrede te veranderen in Oorlog en Vrede).
Probleem is uiteraard dat er allerlei tags in xml zitten zoals &lt, &gt, &apos en noem maar op, die ik niet wil vinden/vervangen !
S&R heeft de mogelijkheid om met regular expression te zoeken, dus ik dacht dat dit de oplossing was om de juiste string te isoleren :

\&&!(\&gt|\&lt)

dus ; zoek naar &, maar niet in combinatie met gt en of lt (en nog een aantal tags). Helaas lijkt het alsof S&R zodra 1 v/d tags (bijv. &lt) gevonden wordt in een bestand, er niet verder wordt getest op andere occurences van & !?
Waarschijnlijk moet ik het zoeken in de lengte waarover gezocht wordt naar een match, maar hoe vertaal ik dat naar regexp ?

Acties:
  • 0 Henk 'm!

  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 16:41
als ik je huidige regex in http://regexpal.com/ gebruik, krijg ik helemaal geen matches.

voorbeeld:
\&&!(\&gt|\&lt)
ik ga &lt naar duitsland & mallora dit jaar &gt

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ik weet niet wat voor syntax je verzonnen hebt, maar een negative lookahead schrijf je met (?!(ditStukRegexMotIkNiet)) ;)

{signature}


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
The ampersand character (&) and the left angle bracket (<) may appear in their literal form only when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section. If they are needed elsewhere, they must be escaped using either numeric character references or the strings "&amp;" and "&lt;" respectively.
Waarom zoek je niet op &amp;? Of heb je niet-valide xml? :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Goner
  • Registratie: Mei 2002
  • Laatst online: 20-09 11:26

Goner

What can I do you for ?

Topicstarter
Dat sowieso, besef ik nu ... het is een export uit een DMS en in de xml-tags staat overal keurig &amp, maar in de waardes niet.
Bijv.
code:
1
2
3
<Container Name='Oorlog &amp; Vrede'>
Search & Destroy
</Container>

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Als het op plek 1 wel geescaped is en op plek 2 niet wordt het lastiger. Eigenlijk vraag je je toch weer af wat er mis was met al die goed werkende XML-libraries...
spoiler:
\B&(?:amp;)?\B

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • pim
  • Registratie: Juli 2001
  • Laatst online: 17-09 11:39

pim

De volgende woorden:

&(quot|amp|lt|gt|nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|
sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|
Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|
Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|
auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|
ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|euro|#{0,99999});


vervangen door:
Uniek_onzin_woord\1 (bijv. Uniek_onzin_woordquot;)

Vervolgens overal & vervangen door 'en'.

En vervolgens "Uniek_onzin_woord" vervangen door &.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Als het een eenmalige actie is dan zou ik het gewoon in 3 acties doen:
- een zooitje simpele S&R voor > naar #gt; zodat al je gewenste tokens veilig zijn
- & vervangen naar en
- Al je tokens weer terug veranderen

En dat is uitgaande van invalid xml.

Als je gewoon valid xml hebt dan zou ik het gewoon door een parser trekken dan S&R en dan weer terug parsen

Mijn ervaring met invalid data parsen is dat regexen over het algemeen veel meer tijd kosten om goed te bouwen dan een tussenweg. Of je ziet de regex direct of je doet er langer over om de regex goed uit te werken dan je ooit bezig bent met 10 handelingen.

Houdt er bijv wel rekening mee dat een & wel en geen spaties eromheen kan bevatten, daarnaast kan er een new-line na volgen gevolgd door een spatie en ... en ...

Acties:
  • 0 Henk 'm!

  • Goner
  • Registratie: Mei 2002
  • Laatst online: 20-09 11:26

Goner

What can I do you for ?

Topicstarter
Geniaal !
Dank voor de tips allen _/-\o_

Acties:
  • 0 Henk 'm!

  • Wiethoofd
  • Registratie: Juli 2007
  • Laatst online: 14-08 12:22

Wiethoofd

Broadcast TOM

Volgens mij is/was het makkelijker om op een & te matchen en een negate op de semicolon, dan pak je namelijk echt alleen de losse ampersands en niet de htmlentities.

Je had volgens mij ook zelfs eerst een html_entity_decode er overheen kunnen halen om vervolgens je & door 'en' te vervangen en eventueel weer te encoden als je het als output gaat gebruiken.

Ik lees net dat een <Container> wel de htmlversie bevatte, als je je xml omzet komt die volgens mij in je key te staan, dan is het simpel je value str_replacen.

Volg me op Twitter/X & Bluesky

Pagina: 1