2015-04-23 96 views
0

我想刪除以space#符號開頭的文本末尾的所有單詞。 不應刪除句子中的URL或主題標籤。刪除句子末尾的#標籤

示例文本:

hello world #dontremoveme foobar http://example.com/#dontremoveme #remove #removeme #removeüäüö 

我試過,但它會刪除所有的井號標籤:

$tweet = "hello world #dontremoveme foobar http://example.com/#dontremoveme #remove #removeme #removeüäüö"; 
preg_match_all("/(#\w+)/", $tweet, $matches); 
var_dump($matches); 

我的想法是要檢查每一個字開始在文本的結尾領先#用前面有space,直到不再是這種情況。 如何將其轉換爲正則表達式?

回答

0

您可以使用類似如此的東西:(#[^# ]+?)+$並將其替換爲空字符串。

舉例here。由於您有非ASCII字符,因此.運算符(匹配任何字符)應該可以幫助您處理任何字符。

0

以下正則表達式匹配行末尾的所有以[Space]#開頭的單詞。

/(#\S+)*$/g 

https://regex101.com/r/eH4bJ2/1

+0

我嘗試過了,得到這個錯誤:'警告:preg_match_all() function.preg-match-all]:未知修飾符'g'' PHP:'$ tweet =「hello world #dontremove我foobar http://example.com/#dontremoveme #remove #removeme#removeüäüö「; preg_match_all(「/(#\ S +)* $/g」,$ tweet,$ matches); var_dump($ matches);'我需要改變什麼? – Tom

+0

請嘗試以下操作: '$ re =「/(#\\ S +)* $ /」; $ str =「hello world #dontremoveme foobar http://example.com/#dontremoveme #remove #removeme#removeüäüö」; preg_match_all($ re,$ str,$ matches);' 這是生成的代碼,你可以在這裏找到:https://regex101.com/r/eH4bJ2/1#code_0 – jonas

+0

這可以工作,但'print_r $匹配)'輸出2個數組 - 如何獲得一個數組中的所有標籤? – Tom

0

這將做的工作:

$tweet = "hello world #dontremoveme foobar http://example.com/#dontremoveme #remove #removeme #removeüäüö"; 
$res = preg_replace("/ #\p{L}+\b(?!\s+\p{L})/u", '', $tweet); 
echo $res,"\n"; 

輸出:

hello world #dontremoveme foobar http://example.com/#dontremoveme 
+0

我剛剛試過你的例子,「$ res」回顯爲空。有最小值嗎? PHP版本需要或我錯過了什麼?謝謝 – Tom

+0

@Tom:我的php版本很老:'PHP 5.4.4-9(cli)(built:Oct 26 2012 13:00:59)'。你做了代碼的複製/粘貼嗎?我已經得到了我所寫的。 – Toto

+0

是的,我用複製和粘貼,並沒有什麼別的PHP文件。我的PHP版本是:'PHP Version 5.3.28-nmm2'任何想法? – Tom