2011-06-06 42 views
2

我正在研究一種提及腳本,它在新聞文章或其他內容中提及時會獲取用戶個人資料鏈接。我已經完成了提及腳本,但它在找到空間後拆分了用戶名。當用戶想要提及某人時,他們將以@符號開始他們的名字。PHP提及腳本

所以我的腳本找到一個空格後停止。這意味着如果我想提一個像@This這樣的用戶名。它只會拿起這個。

任何人都可以告訴我如何可以拿起用戶名與空格中?這是我的腳本。

<?php 

$string = "I'm wanting to speak to the user @This is please."; 
$explosion = explode("@", $string); 
$count = count($explosion); 

for($i = 0; $i < $count; $i++){ 
    $explosion2 = explode(" ", $explosion[$i]); 
    $explosion2 = $explosion2[0]; 

    $string = str_replace("@{$explosion2}", "{$explosion2} yeah", $string); 
} 

echo $string; 
?> 

謝謝。

+2

我看到的問題是,你必須區分哪些空間是你想要作爲名稱的一部分,哪些不是......在你的例子中,如果名稱是「這是」或「這是請' – pconcepcion 2011-06-06 12:35:13

回答

1

有沒有辦法找出如果一個用戶名就是一個字或從你的例子多的話,因爲用戶名具有完全相同的格式作爲字符串的其餘部分。有幾種方法可以解決這個問題。

您在@上爆炸,然後閱讀,直到您到達用戶名末尾的某個指示符。所以字符串將隨後需要進行修改,以具有在開始和特殊指標的用戶名結束:

$string = "I'm wanting to speak to the user @This [email protected] please."; 

這將是對你非常方便,因爲你只需要調用一次爆炸,因爲整個的用戶名是在數組的第二個元素。

+0

+1爲了一致性,通過顯式提及。今天我可能會發現'@This is please'表現得像預期的那樣(提到用戶'This is'),但是明天可能會改變(如果用戶'This is please'在此期間被創建)。 – jensgram 2011-06-06 12:41:59

0

你必須編輯這行:

$explosion2 = explode(" ", $explosion[$i]); 

其他明智的,它會得到只有第一個字。如果你想要把所有的名字,直到例如一個點做到這一點:

$explosion2 = explode(".", $explosion[$i]); 
+0

我想要它成爲一個空間。這是我的問題,哈哈。 – Joshua 2011-06-06 12:34:54

+0

@joshua:那麼你簡直不能兼得。 – dynamic 2011-06-06 12:35:32

+0

有一種方法。我只是不知道。 – Joshua 2011-06-06 12:36:03

0

你不能那樣做。通常用戶名不包含空格。

+0

這並不真正開始回答這個問題,恕我直言。 – jensgram 2011-06-06 12:37:43

+0

@jensgram,它確實:不允許用戶名中的空格。問題的解決方案並不總是你期望的那樣。 – mingos 2011-06-06 12:40:35

+0

@mingos我認爲這個問題並不是空格字符*本身*。這與非明確提及。我會用明確的提到,例如''我想和用戶說[這是]請。「 – jensgram 2011-06-06 12:46:26

1

你有辦法查找姓名嗎?我的意思是,您需要能夠排除This is(甚至This is please)才能找到用戶This(如果這是用戶)。

天真的實施將提取@字符和第一個字符在一個用戶名無效之間的字符串(例如,.)。這會給字符串This is please。然後,您可以一次刪除一個單詞並查看用戶名是否匹配。

但是,如果用戶This is存在,則此策略不允許我在字符串"@This is not me."中提及用戶This

爲了解決這個問題,應該提到明確的關於用戶名。這可以通過分隔符(文字,可以自己不是用戶名的一部分),例如:實現

I'm wanting to speak to the user [This is] please. 

@Jons' answer了。

2

如果有兩個用戶名爲「This」和「This is」,並且您有一個文本:「這是,您認爲@這是嚴重嗎?「

我的建議是不允許的空間中的用戶名,否則會導致更多的麻煩比它在其他許多情況下是值得反正(URL創建,例如)。

0

你一定要使用回調,需要一些。是指以確定是否一個用戶名存在,你不能單獨從詞猜測,爲了簡單起見,我寧願一個正則表達式的回調位置:

$str= preg_replace_callback('/@(\w+)(\w+)?(\w+)?/', 'rx_users', $str); 

function rx_users($match) { 
    list($asis, $one, $two, $three) = $match; 

    if (user_exists($user=$one) 
    or user_exists($user="$one$two") 
    or user_exists($user="$one$two$three")) 
    { 
     return "<a href=user/$user>$user</a>"; 
    } 
    else return $asis; 
} 

所以也沒有無user_exists()測試工作,但你當然可以總是回退到假設用戶名只是@$one字/默認值。

0

我相信這個問題的解決方案是在註冊時爲每個註冊用戶分配一個唯一的數字標識符。 然後可以通過用戶名和/或它們的真實名稱來引用每個用戶 - 在第一個和第二個名稱之間有或沒有空格。

以@開頭的字符串將啓動搜索列表中的所有用戶,然後可以從下拉菜單中選擇,就像Facebook或Twitter一樣。