[PHP/Regex] URL's inkorten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Topicstarter
Ik ben een hele tijd terug ook maar eens begonnen aan het maken van een CMS om mijn kennis PHP/SQL/etc. een beetje op te vijzelen. Dat gaat voor zover allemaal prima, ook in de praktijk getest.
Alleen Regular Expressions blijf ik nogal een moeilijk punt vinden. UBB parsen is niet zo'n probleem, maar nu heb ik een probleempje met URL's die op het forum worden gepost...
Je kent die linkjes wel van bijvoorbeeld groups.msn.com, ontiegelijk lange URL's die heel m'n opmaak vern**ken, daarom wil ik ze opsplitsen en de eerste 10 tekens weergeven, ... ertussen en de laatste 10 tekens weergeven (of iets dergelijks). Net als hier op GoT dus.

Nu heb ik al wat geprobeerd met preg_replace_callback, maar als ik het volgende gebruik krijg ik een lege string terug, helemaal geen tekst meer dus:

PHP:
1
2
3
4
5
6
7
8
// Een lange URL inkorten door er puntjes tussen te plaatsen
function CutURL($matches) {
    $split  = str_split($matches[1],10);
    $aantal = count($split);
    return $split[0]."...".$split[$aantal-1];
}

$text = preg_replace_callback("'<a[^<>]*?>(.*?){40,}</a>'si","CutURL",$text);

Dit script wordt uitgevoerd nadat de UBB-code geparsed is, dus moet er op <a>'s worden gecontroleerd en niet op [url]'s oid.

Ik zie eerlijk gezegd niet goed wat ik fout doe :?
Alvast bedankt voor enige hulp aangezien ik al wat gezocht heb dmv Google en hier op GoT natuurlijk. :)

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Als je het tijdens het parsen van je UBB code doet is het wat makkelijker om aan te pakken denk ik. Ook hoef je als ik het me goed herinner geen *? te gebruiken, kies dan een van de twee. En je vervangt nu alle links door de string "CutURL". :P

'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!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Topicstarter
NMe84 schreef op 02 maart 2004 @ 14:04:
Als je het tijdens het parsen van je UBB code doet is het wat makkelijker om aan te pakken denk ik. Ook hoef je als ik het me goed herinner geen *? te gebruiken, kies dan een van de twee. En je vervangt nu alle links door de string "CutURL". :P
Nou nee, het is de preg_replace_callback functie. Daar is het tweede argument een functie en volgens de PHP-manual moet die tussen kwoots... :X

Maar $text is dus helemaal leeg na het uitvoeren van deze replace, dat is mijn grote probleem. Als iemand nog een andere manier weet om het lange URL probleem op te lossen mag ie het natuurlijk ook laten weten.
Ik heb natuurlijk al verschillende dingen geprobeerd, en er gewoon ... achter plaatsen heb ik natuurlijk ook al gehad, maar dat vind ik persoonlijk niet zo'n nette oplossing...

[edit]
Net even zonder quotes geprobeerd maar dat maakt niets uit, en welke *? zou ik dan volgens jou weg moeten laten, want volgens mij heb ik ze toch alletwee nodig?

[edit 2]
Hmm, een lege $text sting treedt dus blijkbaar ook alleen op als er ook een <a> voorkomt in die string. Als die er niet in staat is er niets aan de hand, fout zal dus waarschijnlijk in die functie zitten, ik zoek nog even verder. :)

[ Voor 22% gewijzigd door --MeAngry-- op 02-03-2004 14:16 ]

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 19-09 22:18

chem

Reist de wereld rond

en wat geeft print_r($matches) ?

Lijkt me redelijk standaard debug werk

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Topicstarter
chem schreef op 02 maart 2004 @ 14:17:
en wat geeft print_r($matches) ?

Lijkt me redelijk standaard debug werk
Ja idd, daar zit ik dus net naar te kijken en ik zie alleen dat $matches[0] de gehele <a href="blaat">blaat</a> teruggeeft en $matches verder niets bevat. :|
Mijn expressie is dus fout :'( Wrom krijg ik het gedeelte (.*?) dan niet terug in $matches[1] :?

[edit]
Euhm, {xx,} werkt niet. Als ik die weghaal werkt alles verder wel, maar ik wil dat alleen URL's worden ingekort die langer zijn dan xx tekens. Zelfs als ik voor xx bijvoorbeeld 1 invul krijg ik niets terug in $matches[1] als ik {xx,} weghaal krijg ik dus netjes hetgeen wat tussen <a> en </a> staat terug en het lijkt me toch in performance denkend het slimste om op zoiets te controleren met een regex.

[ Voor 50% gewijzigd door --MeAngry-- op 02-03-2004 14:26 ]

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • mklerx
  • Registratie: April 2000
  • Laatst online: 18-09 16:38
Denk even na, wat betekent dit?

(.*?){40,}

Eerst alles, en dan nog een keer 'iets' van 40 tekens of langer.
En waarom werkt het wel als je {40,} erafhaalt?

Als je er eens van maakte (.{40,})

[ Voor 4% gewijzigd door mklerx op 02-03-2004 14:31 ]


Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Topicstarter
mklerx schreef op 02 maart 2004 @ 14:31:
Denk even na, wat betekent dit?

(.*?){40,}

Eerst alles, en dan nog een keer 'iets' van 40 tekens of langer.
En waarom werkt het wel als je {40,} erafhaalt?

Als je er eens van maakte (.{40,})
:X Bedankt! :)

[edit]
Tis opgelost, maar zonder str_split() omdat deze er ook voor zorgde dat de uitvoer niets leeg was :?

PHP:
1
2
3
4
5
6
7
8
9
// Een lange URL inkorten door er puntjes tussen te plaatsen
function CutURL($matches) {
    $temp   = chunk_split($matches[2], 20);
    $split  = preg_split ("/[\s,]+/", $temp);
    $aantal = (count($split)-2);
    return "<a href=\"$matches[1]\" target=\"_blank\">$split[0]...$split[$aantal]</a>";
}

$tekst = preg_replace_callback("'<a href=\"(.*?)\" target=\"_blank\">(.{80,})</a>'si",CutURL,$tekst);


In ieder geval bedankt voor de hulp. :)

[ Voor 77% gewijzigd door --MeAngry-- op 02-03-2004 15:03 ]

Tesla Model Y RWD (2024)

Pagina: 1