Beste leden,

Ik ben bezig met een forum welke gebruikt maakt van modrewrite, nu wil ik alle vreemde tekens uit de url weghalen wat ik do doormiddel van:

<?php
preg_replace('/\W/', '-', $listTopics['topictitel'])
?>

Met de volgende topic titel:
Nog een test topic!?&#$

Krijg ik het volgende resultaat:
nog-een-test-topic-----

Hij vervangt nu de vreemde tekens dus in - opzich goed bij de spaties maar niet op de plekken van de vreemde tekens, deze moeten gewoon verwijderd worden en klaar. Iemand tips hoe ik dit kan oplossen?

Erwin
<?php
$string = str_replace('--', '-', $string);
?>


Verwijderd dus alle dubbele haakjes en vervangt ze door een enkele.
Ergens aan het eind van het script gebruiken (dus na de preg_replace) en klaar.
met jou methode krijg je aan het eind nog steeds een -

ik zou eerste gewoon een str_replace doen waarbij je ' ' vervangt door '' en dan een preg_replace om de rest gewoon door niks te vervangen.
Ja oke dat is een 'dirty' oplossing denk ik. Is er geen andere optie in preg_replace welke het wel kan doen?

Overigens lost jouw oplossing het niet op. Want de streepjes zijn de vreemde tekens welke helemaal weg moeten, dus ook de streepjes, met str_replace vevang je de streepjes door één streepje.

Edit: Pepijn ik snbao die van jouw ook niet helemaal. Vreemde tekens kunnen van alles zijn als *#$^#*%(&*#%$ '" ; enz.
hmm, nu ik er over nadenk is het eigenlijk wel logisch om ook vreemde tekens in haakjes te veranderen, denk aan [email protected] -> example-domain-com, de truc is dus om dus idd dubbele er uit te filteren, dus misschien checken of ze niet aan het begin of een eind van een string zitten, je wil natuurlijk ook geen '<spatie>naam' -> '-naam' hebben.
iet met '^\-+' en '\-+$' ?
Stel dat de titel van een forum topic de volgende is: Dit is & een test * topic

Dan wil ik als link hebben: dit-is-een-test-topic.

Ik heb het volgende al geprobeerd:

preg_replace('/\W/', ' ', $listTopics['topictitel'])

maar als ik daarna een str_replace doe van de spaties naar - dan krijg ik alsnog aan het einde een reeks streepjes.

Heb nu het volgende gedaan:

str_replace(" ", "-", trim(preg_replace('/\W/', ' ', $listTopics['topictitel'])))

dan krijg ik bij deze titel: Nog een *# test topic!?&#$ dit als resultaat: nog-een----test-topic

toch weer 3 streepjes teveel tussen in. Misschien een functie welke meerdere streepjes achter elkaar vervangt door één streepje?
Ziet er ook goed uit PHP Newbie. Maar waarom krijg ik dit als resultaat:

nog-een--test-topica

Die A aan het einde komt er ineens bij te staan? En helaas nog twee streepjes.
http://www.phphulp.nl/php/scripts/11/1435/

in een versie die - gebruikt als koppelteken ipv _ :
<?php

function URLstring($input){

// delete some chars that not may be replaced with a space char
$temp = str_replace(array("'",'"'),'',$input);
// replace special chars by readable variant
$temp = str_replace(array('&','@','$'),array(' en ',' at ','dollar'),$temp);
// replace strange chars to their equivalent
$temp = preg_replace('#&(.)[a-z]+;#','$1',htmlentities($temp));
// replace all others by an underscore
$temp = preg_replace('#[^a-zA-Z0-9\_]+#','-',$temp);

// done, clean up and return the result
return trim($temp,'-_');
}

function is_validURLstring($string){
return ($string === urlencode($string));
}

?>
Kijk die is echt super. Top!
Als je het script bekijkt zie je dat je kunt kiezen: of tekens verdwijnen helemaal, of ze worden vervangen door de eerste letter van de &..; code na de &. In een reactie onderaan (volgens mij een van mijzelf) staat de code als je alle tekens weg wilt hebben. Die twee streepjes tussen in kunnen ook weg, dan moet je dit invoegen:

<?php
// niet getest, maar zou wel moeten werken.
while(strstr($koppelteken.$koppelteken, $string)) {
$string = str_replace($koppelteken.$koppelteken, $koppelteken, $string);
}
?>

Plaatsen vóór de return maar ná de trim(), da's denk ik de beste plek ;-).


-- Edit: Maar die van Hipska houdt geen rekening met tekens als ä, ë, ò, etc. Die van mij en, staat bij Hipska's script in een reactie, die van Jonathan doen dat wel ;-).

Reageren