Archief - php : Ingewikkelde reguliere expressie ( urls verwerken )

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Squealer

Legacy Member
Ik zoek een reguliere expressie die ik kan gebruiken in preg_replace()


ik zou bepaalde woorden in een tekst willen vervangen door een link. Dit op zich is simpel:

PHP:
$string = preg_replace("/(kernwoord)/","[url=http://www.blabla.be]\\1[/url]",$string);

MAAR:
dat kernwoord mag NIET in bepaalde tags voorkomen. Als het kernwoord reeds in een url tag staat bijvoorbeeld, mag het niet vervangen worden door een link, anders krijgt ge zoiets:

[ url=http://www.xxx.be][ url=http://www.blabla.be]kernwoord[/url][/url]

en da is natuurlijk geen zicht

Als het woord "kernwoord" in een , [img], .... tag voorkomt, mag het...voor? zoja: welke, zoniet: what to do? thx

killgore

Legacy Member
hm, ik zou het zo doen:

eerst je regex op [ url ] tags toepassen, dan bekom je voor die dingen enkel nog zaken als:

Code:
<a href="http://site.com">MIJN SITE</a>

En dan doe je je regex voor zaken zonder [ url ]-tags, waarin je gewoon checkt of er een spatie (of newline) voorstaat of niet.

Het enige waar je dan op moet letten is dat je dit juist omzet:

[ url ] http://mijnsite.com\[/ url ]
naar:
<a href="http://mijnsite.com">&nbsp;http://mijnsite.com</a>
of:
<a href="http://mijnsite.com">http://mijnsite.com</a>
maar niet:
<a href="http://mijnsite.com"> http://mijnsite.com</a>

dan zou het moeten werken

edit: denk da ze die methode vo phpbb gebruiken (daar heb ek ze toch is gelezen).

Squealer

Legacy Member
neen

stel dat bijvoorbeeld "kern" moet vervangen worden in "blabla kernwoord blabla". Dan moet er dit ontstaan:

blabla [ url=http://www.shit.be]kern[/url]woord blabla

dus controleren of er een spatie voor of na staat, kan niet, want ook stukken van een woord moeten veranderd kunnen worden.

de regexp laat ik al lopen bij het wegschrijven naar de database, omdat ze zo maar 1 maal moet uitgevoerd worden. Bij elke pageview die strings gaan checken en vervangen, da is nogal nutteloos é.

edit: denk da ze die methode vo phpbb gebruiken (daar heb ek ze toch is gelezen).

keb et net ff geprobeerd, den output is gewoon letterlijk den input: [ url=dgdfgdfg][ url=ghjghjghj]sdfsfsd[/url][/url]

servi

Legacy Member
moderator noot :
je topic bevat geen prefix, een verkeerd prefix of heeft een onduidelijke titel.
Gelieve een duidelijke titel met een bijhorend correct prefix te gebruiken.
Voor meer informatie over prefixen kan je terecht op regels en prefixen !!!.
Je topic is aangepast, gelieve in het vervolg er op te letten.


en probeer dit eens :

PHP:
	$invoer = htmlspecialchars($invoer,ENT_QUOTES);
	// maak urls, herlopen, anders kan hij 2 urls die direct achtereen komen niet herkennen !
	for ($i = 0; $i < 2 ; $i++ ) {
		$invoer = preg_replace("#([ \r\n]+)([0-9a-z.\-_]{3,128})(@)([0-9a-z.\-_]{4,128})([ \n\r]+)#Ui",'\\1mailto:\\2\\3\\4\\5',$invoer);
		$invoer = preg_replace("#([ \r\n]+)(www\.)(.+)([ \n\r]+)#Ui",'\\1http://\\2\\3\\4',$invoer);
		$invoer = preg_replace("#([ \r\n]+)(mailto:|http://|ftp://)(.+)([ \n\r]+)#Ui",'\\1<a href="\\2\\3">\\3</a>\\4',$invoer);
	}
	$invoer = preg_replace("#(\[url\])(http://|ftp://|mailto:)(.*)(\[/url\])#Ui",'<a href="\\2\\3">\\3</a>',$invoer);
	$invoer = preg_replace("#(\[url=)(.*)(])(.*)(\[/url\])#Ui",'<a href="\\2">\\4</a>',$invoer);

normaalgezien zou dat volgende vormen correct moeten omzetten
www.blabla.be
http://www.blabla.be
[ url = http://www.blabla.be/ ] blabla [ /url ] ( extra spaties toegevoegd)
[ url ] http://www.blabla.be [ /url ]

Squealer

Legacy Member
servi zei:
moderator noot :
je topic bevat geen prefix, een verkeerd prefix of heeft een onduidelijke titel.
Gelieve een duidelijke titel met een bijhorend correct prefix te gebruiken.
Voor meer informatie over prefixen kan je terecht op regels en prefixen !!!.
Je topic is aangepast, gelieve in het vervolg er op te letten.


en probeer dit eens :

PHP:
	$invoer = htmlspecialchars($invoer,ENT_QUOTES);
	// maak urls, herlopen, anders kan hij 2 urls die direct achtereen komen niet herkennen !
	for ($i = 0; $i < 2 ; $i++ ) {
		$invoer = preg_replace("#([ \r\n]+)([0-9a-z.\-_]{3,128})(@)([0-9a-z.\-_]{4,128})([ \n\r]+)#Ui",'\\1mailto:\\2\\3\\4\\5',$invoer);
		$invoer = preg_replace("#([ \r\n]+)(www\.)(.+)([ \n\r]+)#Ui",'\\1http://\\2\\3\\4',$invoer);
		$invoer = preg_replace("#([ \r\n]+)(mailto:|http://|ftp://)(.+)([ \n\r]+)#Ui",'\\1<a href="\\2\\3">\\3</a>\\4',$invoer);
	}
	$invoer = preg_replace("#(\[url\])(http://|ftp://|mailto:)(.*)(\[/url\])#Ui",'<a href="\\2\\3">\\3</a>',$invoer);
	$invoer = preg_replace("#(\[url=)(.*)(])(.*)(\[/url\])#Ui",'<a href="\\2">\\4</a>',$invoer);

normaalgezien zou dat volgende vormen correct moeten omzetten
www.blabla.be
http://www.blabla.be
[ url = http://www.blabla.be/ ] blabla [ /url ] ( extra spaties toegevoegd)
[ url ] http://www.blabla.be [ /url ]

Wat gij hier doet, doet phpBB tijdens het uitlezen van de database. wat ik wil is dat bepaalde woorden in [ url= ] -tags gestoken worden, BEHALVE als ze al in een url of img tag zitten... en dit moet gebeuren VOOR de string in de database wordt geplaatst. Der er is nog absoluut geen sprake van replace naar <a href=....

Praktisch voorbeeld:

je topic bevat geen prefix, een verkeerd [ url]www.prefix.be[/url ] of heeft een onduidelijke titel.
Gelieve een duidelijke titel met een bijhorend [ url=http://www.blabla.be]correct prefix[/url ] te gebruiken.
Voor meer informatie over prefixen kan je terecht op regels en prefixen !!!.
Je topic is aangepast, gelieve in het vervolg er op te letten.

Stel dat "prefix" vervangen moet worden door een link naar www.kaka.be, BEHALVE als die al in een link zit. Dan moet dit worden:

je topic bevat geen [ url=http://www.kaka.be]prefix[/url ], een verkeerd [ url]www.prefix.be[/url ] of heeft een onduidelijke titel.
Gelieve een duidelijke titel met een bijhorend [ url=http://www.blabla.be]correct prefix[/url ] te gebruiken.
Voor meer informatie over [ url=http://www.kaka.be]prefix[/url ]en kan je terecht op regels en [ url=http://www.kaka.be]prefix[/url ]en !!!.
Je topic is aangepast, gelieve in het vervolg er op te letten.

hetgeen onderstreept is is vervangen. Die string moet in den db geplaatst worden. Pas later, bij het uitlezen, worden dan alle url tags vervagen door <a href's>

sneax

Legacy Member
da kunt ge ook wel in phpBB2 code vinden, meer bepeaald zelfs de functie
make_clickable()

ik zou zeggen include eenvoudigweg de include files van phpbb2 of als ge geen phpBB2 forum gebruikt, download het en cut de code van make_clickable, ge zult dan waarschijnlijk wel nen hoop functies die in make_clickable gebruikt worden ook moeten opzoeken in phpBB2 en die code ook kopieren

Squealer

Legacy Member
kan goe zijn dat het daarmee te maken heeft, maar keb geen flauw idee hoe dak et moe gebruiken

keb een phpbb forum en ook ne site die bbencode functies van het forum gebruikt.

alsek het te vervangen woord in ne link zet is de pagina fucked up enzo, omteven waar ik die make_clickable laat toepassen

killgore

Legacy Member
sneax zei:
da kunt ge ook wel in phpBB2 code vinden, meer bepeaald zelfs de functie
make_clickable()
en daar heb ik men uitleg gehaald, die bij mijn weten nog altijd juist is zunne :s

Squealer

Legacy Member
killgore zei:
en daar heb ik men uitleg gehaald, die bij mijn weten nog altijd juist is zunne :s

ja allemaal goed en wel, maar kweet niet hoe ze toe te passen

[ url=http://www.kernwoord.be]slmkf[/url]

wordt bij mij dan

[ url=http://www.[ url=http://www.mijnelink.be]kernwoord[/url].be]slmkf[/url]


en da zieter nie mooi uit é :)

dat is mijn probleem, kernwoord mag enkel maar vervangen worden als het NIET in een url of img tag staat. Nie afkomen me controleren of er een spatie voorstaat want kernwoord in "kernwoorden" moet ook vervangen worden

killgore

Legacy Member
-P|b-SqUeaLeR zei:
ja allemaal goed en wel, maar kweet niet hoe ze toe te passen

[ url=http://www.kernwoord.be]slmkf[/url]

wordt bij mij dan

[ url=http://www.[ url=http://www.mijnelink.be]kernwoord[/url].be]slmkf[/url]


en da zieter nie mooi uit é :)

dat is mijn probleem, kernwoord mag enkel maar vervangen worden als het NIET in een url of img tag staat. Nie afkomen me controleren of er een spatie voorstaat want kernwoord in "kernwoorden" moet ook vervangen worden
zoals ik zeg:

ze doen eerst het volgende:

alle [ url] -tags omzetten naar iets van het volgende: <a href="link">text</a>
let op het feit dat voor text geen spatie meer staat ;).

daarna zetten ze alle text die aan de regex van url (denk da servi die poste) voldoet en na een spatie/newline komt om naar een url <a href="link">link</a>.
de regexen zelf zitten in de include file bbcode van het phpbb-forum ;).
Omzetten van iets als keyword naar [ url]keyword[/url] zal imho veel ingewikkelder/moeilijker/tijdrovender zijn.

Squealer

Legacy Member
killgore zei:
Omzetten van iets als keyword naar keyword zal imho veel ingewikkelder/moeilijker/tijdrovender zijn.

dat is net wat ik wil

en ik include al de bbcode file van het forum

Het is voor een sponsor, bepaalde kernwoorden in berichten geplaatst door members van mijn site, moeten vervangen worden door een link naar de website van de sponsor. Ook als dat kernwoord een deel is van een ander woord. Op pureesoiree.be is dat bijvoorbeeld het geval. Op hun forum word alles wat met studenten/studiant te maken heeft, vervangen door een link naar de studiant site. Zo moet het ook bij mij

killgore

Legacy Member
hm :s, kversta je vraag eigenlijk nu pas deftig :).

zoiets dan:

"#(?<!\[url\])keyword(?!\[\/url\])#is"

kleine basis, die je zelf wel moet uitbreiden:

(?<!\[url\]) ---> kijkt of keyword niet na [ url] tag komt
(?!\[\/url\]) ----> kijkt of [ /url] niet na keyword komt.

todo:

in [ url]akeywordb[/ url] wordt keyword wel weer omgezet naar url tags :( (met a en b gelijk welk teken, incl. spaties).

Squealer

Legacy Member
Had ondertss al wat gelezen over "Assertions", maar ik kan niet controleren op het voorafgaan van "[url=...".
Ik kan controleren of "[url=xyz" (vaste string) voorafgaat, maar "[url=.*" gaat niet:

Warning: Compilation failed: lookbehind assertion is not fixed length

sneax

Legacy Member
Oh nu snap ik het, ge wilt kernwoorden omzetten naar sponsor links.

Ik zou gewoon in mysql een lijst maken van woorden die allemaal gekoppeld zijn aan een URL, dan net VOOR ge uw content laat tonen replaced ge elk woord dat in uw mysql lijst voorkomt door een link met dat kernwoord.

Als ge op uw site aant browsen zijt en ge ziet een woord dat ge denkt dat naar een bepaalde sponsor moet leiden dan add ge da ff aan de database (heel snel), en zo is het ook extreem flexibel.

Dit is toch wa ge bedoelt? En zo is het toch eenvoudig te maken?

killgore

Legacy Member
sneax zei:
Ik haal het gewoon uit de database, heb geen support voor bbcode maar doe gewoon
$string = make_clickable($string);
en da marcheerd, $string is gewoon al uwen text van uwe post of whatever

ik gebruik hierbij GEEN bbcode, dus make_clickalbe doet niks me ofzo, wss moet ge eerst make_clickable doen en dan bbencode of omgekeerd
nee, da ist niet.

hij wilt standaard bv. het woord TELENET laten omzetten naar een bb-code van het formaat: [ url=http://breedband.telenet.be]Telenet[/url], maar dit mag niet als het reeds in [ url] tags staat.

kleine workaround mssch :s:

zet eerst gewoon je keyword om naar bb-code, ongeacht nesting.
en check daarna met een andere regex naar geneste bb-codes en verwijder die nesting. (denk dat dit toch al iets simpeler moet zijn :s).

dus bv.
PHP:
$text = str_replace("telenet","[url=http://breedband.telenet.be]telenet[/url]",$text);
$text = preg_replace("#\[url\](.*?)\[url=(.*?)\](.*?)\[\/url\](.*?)\[\/url\]#is","[url]\\1\\3\\4[/url]",$text);
die regex is op 2 min. opgesteld en trekt op geen knoppen, weet ik zelf ook, ma het is ma een idee he.

Squealer

Legacy Member
killgore zei:
nee, da ist niet.

hij wilt standaard bv. het woord TELENET laten omzetten naar een bb-code van het formaat: [ url=http://breedband.telenet.be]Telenet[/url], maar dit mag niet als het reeds in [ url] tags staat.

kleine workaround mssch :s:

zet eerst gewoon je keyword om naar bb-code, ongeacht nesting.
en check daarna met een andere regex naar geneste bb-codes en verwijder die nesting. (denk dat dit toch al iets simpeler moet zijn :s).

dus bv.
PHP:
$text = str_replace("telenet","[url=http://breedband.telenet.be]telenet[/url]",$text);
$text = preg_replace("#\[url\](.*?)\[url=(.*?)\](.*?)\[\/url\](.*?)\[\/url\]#is","[url]\\1\\3\\4[/url]",$text);
die regex is op 2 min. opgesteld en trekt op geen knoppen, weet ik zelf ook, ma het is ma een idee he.

hmmm dit is bruikbaar
morgen eens uitproberen thx
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan