2016-09-22 32 views
-1

編寫一個instagram小部件給我留下了一個我自己無法解決的問題。我收到包含圖像描述和標籤的數組文本,所以像:PHP str-replace從數組中取出整個單詞

"text": "#Hashtag ! Lorem Ipsum dolor sit ament. #hash #myword #another #hashing", 

和含有像所有的標籤另一個數組:

"tags": [ 
     "hashtag", 
     "hash", 
     "myword", 
     "another", 
     "hashing", 
     ], 

我的插件提供了一個選項,選擇以顯示描述,標籤或說明和標籤。

因此,我必須從標籤中刪除標籤。到目前爲止這麼容易。 首先,我把所有的標籤和擴展它們以「#」開始,所以「hashtag」變成「#hashtag」並將它們保存到一個新的數組(alltags)。

之後我正在用str_replace進行檢查,以替換文本內部的所有hashtags。它需要被str_replace爲keysensitive。

$noTags = str_replace($alltags, "", $instagramText); 

文本的輸出

tag ! Lorem Ipsum dolor sit ament. 

,因爲「#標籤」的哈希得到由「散」主題標籤所取代。

我發現這個解決方案:PHP string replace match whole word這應該爲我工作。但是我有一個完整的數組來檢查(動態)不只一個單詞。

現在的問題是: 我如何檢查整個單詞不僅是單詞的一部分,讓「散」不會影響「主題標籤」?

編輯 我想要顯示「Hashtag!Lorem Ipsum ....」不僅僅是「!Lorem Ipsum ...」。這就是爲什麼我對密鑰敏感 - 連接標籤都是小寫字母(哈希),句子中使用的標籤是而不是小寫字母(Hashtag)。所以我可以刪除那些我不需要建立正確的句子。例如,它也可以是「我們#想你」 - 所以傳遞的標籤將是「想要的」。如果我將所有輸出替換爲「我們你」。如果我用keysensitive替換整個單詞,它將是「我們#想你」。希望你明白我想要做什麼。

謝謝!

回答

1

嘗試使用RegEx去除主題標籤。您可以使用preg_replace函數,例如

$tags = implode('|', $tagsArray); 
$noTags = preg_replace('/\#(' . $tags . ')\b/i', '', $instagramText); 

所以實際上它會是:

$noTags = preg_replace('/\#(hashtag|hash|myword|another|hashing)\b/i', '', $instagramText) 
// result: 
" ! Lorem Ipsum dolor sit ament. " 

這樣它去除所有單詞(與\ b單詞邊界元字符),以#開頭的字符。

希望它有幫助。

編輯

使用preg_replace_callback檢查是否匹配井號標籤開始用大寫,如:

preg_replace_callback(
    '/\ ?#(' . $tags . ')\b ?/i', 
    function($matches) { 
     return is_first_uppercase($matches[1]) ? str_ireplace('#' . $matches[1], $matches[1], $matches[0]) : ''; 
    }, 
    $instagramText 
); 

你只需要實現is_first_uppercase功能,例如like this

With:

"#Hashtag ! Lorem Ipsum #Dolor sit ament. #hash #myword #another #hashing" 

應該產生:

"Hashtag ! Lorem Ipsum Dolor sit ament." 
+0

克里斯 - 嗨,你的解決方案會有所幫助,但我忘了一個重要的信息,我猜。我想要顯示「Hashtag!Lorem Ipsum ....」不僅僅是「!Lorem Ipsum ...」。這就是爲什麼我去敏感鍵 - 標籤都是小寫字母,在句子中使用的標籤不是小寫字母(Hashtag),只是用於鏈接的標籤是小寫字母(哈希)。所以我可以刪除那些我不需要建立正確的句子。 – ThomasB

+0

@ThomasB好的,我忘記了。您可以刪除正則表達式末尾的_case不區分(i)_開關,它也應該匹配字符大小寫。 但你是否也想用'Hashtag'代替'#Hashtag'? – chris

+0

說實話,我不知道上面的代碼應該做什麼?我不熟悉PHP中的替換,所以我不明白爲什麼你有str_ireplace匹配[1]匹配[1]匹配[0]。順便說一句:我試圖插入它,編輯它在執行第一個元素時崩潰了我的頁面。 – ThomasB