[PHP + REGEXPR] opvangen van @username in tekst

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi ik ben bezig met een message systeem die usernames behandeld zoals dat in twitter gebeurd.
dus een tekst als:

@willem @henk gaan we vanavond nog stappen? mail me dan op gekkert@stappenisleuk.nl

Hier moeten de @willem en @henk worden vervangen door en link naar hun profiel.
echter moet het email adres weer niet vervangen worden.

Ik moet dus eenmatch vinden op strings die beginnen met een @ en het woord er achter wil ik dan opvangen en een <a> omheen kunnen zetten.

Ik heb op dit moment dit:

PHP:
1
2
3
4
5
6
7
8
9
10
function convert( $note )
{
    $patterns[0] = '/@{1}([A-Za-z0-9_]+)/';
    $patterns[1] = '/#{1}([A-Za-z0-9_]+)/';

    $replacements[0] = '@<a href="'.site_url('angler/$1').'">$1</a>';
    $replacements[1] = '#<a href="'.site_url('search/$1').'">$1</a>';

    return preg_replace($patterns, $replacements, $note);
}


dit werkt wel maar past ook de email adressen aan en dat is niet de bedoeling.

iemand die erg veel verstand van regular expressions heeft?!

Acties:
  • 0 Henk 'm!

  • Zeebonk
  • Registratie: Augustus 2005
  • Laatst online: 30-07 20:50
Ik ben niet super met regex, maar aan de hand van je voorbeeld denk ik dat de belangrijkste kenmerken van een user tag de spatie voor het apenstaartje is en het onbreken van een punt in de username (mits dat niet is toegestaan tijdens het aanmaken van een username). Daar kan je je regex wel op specificeren.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Je moet allereerst zoeken naar het begin van je string of whitespace voorafgaande aan het @-teken. Daarna doorlopen tot de volgende whitespace of het einde van je string.

Uit m'n hoofd ongeveer zoiets:

code:
1
/(^|\s)@\w+/

[ Voor 14% gewijzigd door HuHu op 25-12-2009 12:46 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bedankt, dat is het inderdaad.
Ik heb nu het volgende wat voor me werkt!

thanks again!


PHP:
1
2
3
4
5
6
7
8
9
10
function convert( $note )
{
    $patterns[0] = '/(^|\s)@(\w+)/';
    $patterns[1] = '/(^|\s)#(\w+)/';

    $replacements[0] = ' @<a href="'.site_url('angler/$2').'">$2</a>';
    $replacements[1] = ' #<a href="'.site_url('search/$2').'">$2</a>';

    return preg_replace($patterns, $replacements, $note);
}

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Alternatief, zonder "@" zelf te matchen:
code:
1
/\B@\K\w++/

Dit gaat er vanuit dat het eerste deel van een emailadres op \w eindigt (dus ".@jan" genereerd dan ook een match). \K retourneert het deel daarvoor niet, en ++ geeft een hint dat backtracking nooit nodig is.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • 3V3RT
  • Registratie: Januari 2004
  • Laatst online: 16-08 22:30
Pagina: 1