2016-05-22 6 views
0

ich diese MySQL-Benutzerretrieving twitter wie usename Links php

1 master 
2 mastercard 
3 mastercom 

Im nächsten Zeichenfolge haben, möchte ich sie in sein eigenes Profil der Benutzer (@user)

$string=" Hi, I would like to met up with @master @mastercard @mastercom and @masterhigh "; 

wo verknüpfen @ masterhigh gehört nicht zur mysql-Tabelle und muss nicht mit seinem Profil verknüpft sein.

Ich habe diesen Code

preg_match_all('/@(\w+)/',$string,$matches); 

foreach ($matches[1] as $match) { 
    // 
$user=mysql_query("SELECT id_user FROM $table_users WHERE username='$match' LIMIT 1"); 
$user_n=mysql_fetch_array($user); 
    //num 
    $user_num=mysql_num_rows($user); 
    $id_user=$user_n['id_user']; 

if($user_num>0){ 
//user exists (link to profile) 
$imatch="<a href='?s=$id_$user'>@".$match."</a>";  
}else{ 
//user NOT exists (NOT link to profile) 
$imatch ="@$match"; 
}  
$string=str_replace("@".$match,$imatch,$string);  
} 
echo $string; 

Während die Benutzer differents sind, alles ist in Ordnung, aber wenn sie mit den gleichen Buchstaben beginnt, verbindet der Code nur die wiederholten Buchstaben (@master) und nicht auf @ umleiten Mastercard-Profil oder @ Mastercom-Profil. Ich denke, str_replace() funktioniert nicht wie erwartet. Was mache ich falsch? 5 Sterne.

Antwort

0

Erstens verwenden Sie nicht mysql_ * Funktionen sie sind veraltet. Zweitens. str_replace ersetzt alle Vorkommen in der Zeichenfolge beginnend mit der ersten Übereinstimmung. Also wird @mastercard @mastercard und @mastercard wird nie ersetzt. Suchen Sie besser nach Leerzeichen, Tabulatoren, Endofstrings usw. in Ihrem regulären Ausdruck und ersetzen Sie sie dann durch den gleichen regulären Ausdruck. Code zur Vereinfachung geändert:

$string=" Hi, I would like to met up with @master @mastercard @mastercom and @masterhigh, @masterhigher. and all other @mesters"; 

// Serch for whitespace or other char after username 
preg_match_all('/@(\w+)(?=\s|$|,|\.)/', $string, $matches); 

foreach ($matches[1] as $match) { 
    $imatch="<b>@".$match."</b>"; 
    // replace exact username with new markup 
    $string=preg_replace("/@" . $match . "(?=\s|$|,|\.)/", $imatch, $string); 
} 

echo $string; 
+0

Ist diese Regex '(? = \ S | $ |, | \.) /' Ersetzen Sie ein Trennzeichen? oder nur Punkt, Dollar und Komma? – masterhoo

+0

nur Punkt und Komma, Dollarzeichen ist "Ende der Zeichenfolge" in Regexp. Du kannst beliebig viele hinzufügen, indem du oder den Operator '|' verwendest, wenn es ein Sonderzeichen in regexp ist, setze es mit '\' (wie Punkt in meinem Beispiel) fort. –

+0

Ich glaube du kannst '\ @ (\ w +) (? ! \ w) \ 'pattern wenn du nicht alle möglichen Trennzeichen auflisten willst –

Verwandte Themen