Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[RegEx]Stukken uitsluiten bij controle

Pagina: 1
Acties:

  • Xerohumoris
  • Registratie: Augustus 2010
  • Laatst online: 19-11 19:51
Hoi allemaal,

Ik heb een keer, lang geleden, een regulair expression gevonden die alle webadressen voor mij uit een stuk tekst haalt. Nu wil ik echter dat alle tekst die tussen [] staan niet worden meegenomen in de evaluatie van de tekst.

Nu wat ik zelf heb:
Voor het vinden van een url:
code:
1
$\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]$i

Het stuk code waarmee ik hoop alles tussen [] over te slaan:
code:
1
!(\[([0-9][a-zA-Z][ ])\])

Ik heb al veel meer geprobeerd dit leek mij het logisch.
Als ik ze combineer tot:
code:
1
!(\[([0-9][a-zA-Z][ ])\]) $\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]$i

Krijg ik de volgende fout:
code:
1
Unknown modifier ':'


De bedoeling is om het in de preg_match_all() van PHP te gebruiken.

Ik hoop dat iemand kan helpen. Een goede Nederlandstalige hulp kan ik ook erg waarderen.

Daniël

  • Viper®
  • Registratie: Februari 2001
  • Niet online
Ik gebruikte zelf altijd RegEx van gskinner voor het testen van mijn regular expressions:
http://regexr.com/#

Er is onlangs een nieuwe versie uitgebracht.

  • Room42
  • Registratie: September 2001
  • Niet online
Eerst ter info:
Dit is een goede tool om je regexp's mee te testen/ontwikkelen: http://leaverou.github.io/regexplained/
En deze vind ik ook fijn: http://regex101.com/

Ik denk dat jij de fout in gaat met je delimiter ;) Je geeft geen voorbeeld 'subject' (tekst), dus ik kan hem niet voor je testen (ik weet niet precies wat je nou wilt filteren), maar ik heb het idee dat jouw pattern niet gaat werken.

[ Voor 29% gewijzigd door Room42 op 28-07-2014 16:14 ]

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik denk dat die aanpassing aangeeft dat je regex nog moet leren ;) In de originele regex had je $ als delimiter, nu ! Die : staat achter een niet geescapte !, en geeft daardoor een foutmelding. Maar daarnaast doet ! niets bijzonders in een regex, behalve een uitroepteken matchen, en is het niet duidelijk wat je precies niet wil matchen. Ter uitleg van wat dat stukje doet dat je hebt gemaakt: http://www.regexper.com/#!%28\[%28[0-9][a-zA-Z][%20]%29\]%29

Je zou eventueel met een negative lookbehind kunnen werken (niet matchen bij een open [ zonder ] erachter), erg efficiënt is dat niet. Dit zal wat inlezen of hulp vereisen om goed te krijgen..

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Xerohumoris
  • Registratie: Augustus 2010
  • Laatst online: 19-11 19:51
Ik zal een voorbeeld geven:

code:
1
2
Kijk eens naar deze video [youtube url=http://www.youtube.com/watch?v=_OBlgSz8sSM /]
Of kijk hem op youtube zelf http://www.youtube.com/watch?v=_OBlgSz8sSM


De eerste versie waar een url in de youtube tag staat moet hij overslaan. De tweede moet hij wel door de regex worden opgevangen.

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 21-11 10:33
Ben je er in dit geval dan niet door te checken of er voor de http een = teken staat?
In dat geval kun je een assertion gebruiken
code:
1
$\b(?<!=)(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]$i


Controleren of je wel of niet tussen blokhaken zit is lastiger en eigenlijk niet geschikt voor regexen. Je moet dan meer denken aan parsen en tokenizen.

[ Voor 26% gewijzigd door frickY op 28-07-2014 17:24 ]


  • Xerohumoris
  • Registratie: Augustus 2010
  • Laatst online: 19-11 19:51
Dat zou een optie zijn. Maar ik wil dat hij alles uitsluit tussen de [] Dat is namelijk een teken dat de tekst al is opgemaakt er het dus niet nodig is om er naar te kijken. Het kan namelijk zijn dat ik op sommige punten de noodzaak voor de 'url=' weg ga halen.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dit soort dingen wil je gewoon niet puur met regular expressions doen, maar een simpele stackbased parser is veel eenvoudiger. Om je string in tokens op te delen kan je eventueel nog regular expressions gebruiken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Interessant is of escaping ook mogelijk is, zoals hier op dit forum met \\\[ en [url="blalb[blabla"]. Verder is het vaak een kwestie van positief matchen. Je zou een groep vooraf kunnen toevoegen met geen of alleen afgesloten ubb codes (als in \G([^[]|\[[^[]*+])*?, ongetest), maar dan moet je ook nog met escaping rekening houden.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Xerohumoris
  • Registratie: Augustus 2010
  • Laatst online: 19-11 19:51
Ik gebruik de RegEx van frickY nu omdat deze werkt zoals zou moeten. Ik zal mij eens wat dieper in de regex gaan verdiepen. Ik probeer het al jaren een beetje onder de knie te krijgen maar kan nergens een plek vinden die het uitlegt op een manier die ik snap. Zeker niet als het om complexere constructies gaat.

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 21-11 10:33
Dit is een prima overzicht van de features die binnen PHP ondersteund zijn; Pattern Syntax

Je hoeft niet alles uit je hoofd te kennen, zolang je maar weet wat de mogelijkheden zijn en waar je de details vind. Een handig windows programma-tje is Regex Coach. Hier in zie je snel wat je regex precies doet.

Verwijderd

Luister naar Woy.

In dit geval wil je een context-gevoelige lexical analyzer. Op het moment dat je een los [ teken tegenkomt wil je overgaan naar een andere state waarin je alles negeert tot je weer ] tegenkomt.

Overigens wil je voor dit soort zaken een parser generator gebruiken, dat scheelt veel hoofdpijn als je nog eens wat wilt aanpassen.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Eigenlijk wil je zelfs precies dezelfde parser gebruiken die nu toch al wordt gebruikt om die ubb codes te parsen ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1