Op dit moment ben ik een logboek aan maken waar je regels kan toevoegen, in de regels kan je via een autocomplete ook namen invullen, deze komen dan vervolgens als @naam achternaam in de regel te staan.
Nu wil ik dat deze namen klik baar worden zodat ik kan alles in een overzicht kan zien.
Probeer met preg_replace dit voor elkaar te krijgen, ik loop tegen twee problemen aan.
Dit heb ik tot nu toe:
$str = "Dit is een test met een naam er @vooraam achternaam hoe krijg ik dit goed?";
echo preg_replace( "/([@]+\w+\w+[ ]+\w+\w)/", "<a href=\"test.php?$1\">$1</a>", $str);
De link klopt wel maar loop tegen twee problemen aan:
1. Wil niet dat in de link ook @ staat. Nu is het test.php?@voornaam achternaam, optimaal zou het zijn als het test.php?voornaam_achternaam zou kunnen worden.
2. Als iemand een tussenvoegsels heeft, mis ik dus de achternaam.
Is preg_replace de juiste manier om dit te toen of kan dit ook anders?
Soms is het beter om je af te vragen of je het wel goed opslaat.
Data opslaan (in een tekst bestand?) met @ en vreemde tekens waar je het vervolgens weer wilt ophalen en weer uit elkaar wilt trekken klinkt niet logisch.
Is het niet mogelijk de data op te slaan in database? Of als je het perse in een tekst bestand wilt, kijk dan eens naar serialize. Hiermee heb je een object die je daarna een stuk makkelijker kan uitlezen. Voorkeur gaat natuurlijk uit naar een database.
<?php
$str = "Dit is een test met een naam er @vooraam achternaam hoe krijg ik dit goed?";
echo preg_replace( "#@(\w+\s\w+)#", "<a href=\"test.php?$1\">$1</a>", $str);
?>
Gebruiken van space zal niet altijd een goed resultaat geven.
bijv. een fout hier @van voornaam achternaam
Beter gebruik underscores
@vooraam_van_der_achternaam
<?php
$str = "Dit is een test met een naam er @vooraam_achternaam hoe krijg ik dit goed?";
echo preg_replace_callback( "#@(\w+_*)#",
function ($matches) {
$tmp = str_replace('_',' ',$matches[1]);
return '<a href="test.php?'.$tmp.'">'.$tmp.'</a>';
}
, $str);
?>
De code van Simo kan nog wat mooier door gebruik te maken van character klasses: (en ook wat sneller gemaakt door niet gebruik te maken van een captured group, maar in plaats daarvan een lookbehind voor de @)
<?php
$str = "Dit is een test met een naam er @vooraam_achternaam hoe krijg ik dit goed?";
$parsedStr = preg_replace_callback("/(?<=@)[\w_]+/", function ($match) {
$humanifiedUsername = str_replace('_', ' ', $match[0]);
// het gebruik van spaties in een URL is ook niet echt aan te raden...
return '<a href="test.php?'.urlencode($humanifiedUsername).'">'.$humanifiedUsername.'</a>';
}, $str);
echo $parsedStr;
?>
[offtopic]Ik wordt blij van het zien van een Symfony2 logo op het forum :)[/offtopic]