2011-12-09 53 views
1

卡住在正則表達式匹配中的新案例... 我有一個字符串,包含單詞,#hashtags,@useranmes和其他misc字符。正則表達式替換基本@username和#hashtag與一些特殊情況

一些例子,他們變得更加混亂和混亂。 '我的新車'通常是可選的,並且不會存在,因爲這是一個預替換,我將以空字符串結束,在我的情況下,這是可取的。但是,如果「我的新車」確實存在,這將是導致所需的字符串

  1. 我的新車#wheels #car #AUTO #drive #weekend
  2. 我的新車#wheels #car #AUTO #drive #weekend @me
  3. 我的新車#wheels,#car,#AUTO,#drive,#weekend
  4. 我的新車#wheels,#car,#AUTO,#drive,#weekend,@me (全以上,沒有「我的新車」,通常雙倍間距的混亂等) (然後人們看中並在字符串中添加表情符號
  5. 我的新車#wheels #car \ ud83d \ ude2d \ ud83d \ ude2d \ ud83d \ ude2d \ ud83d \ ude02

所需的結果:1。 我的新車 2.我的新車 3.我的新車 4.我的新車 5.我的新車

我是這樣做很好用(^|\s)[#@](\w+),然後表情符號開始發揮作用,以及有趣的方形其表示爲\ ue412 \ ue412

我認爲我只需要找到一種方式來說,如果開始於\去除到最後。我想以另一種方式去做,否定任何不是[a-zA-Z0-9]的東西,但這也是多語言的。

有什麼建議嗎?

+0

你的例子很奇怪..如果你只想要我的新車,你只需刪除#後面的所有內容。但顯然你還沒有想要的其他東西 - 或者我不明白。 – FailedDev

+0

對不起,'我的新車'並不總是在前面。[#這是#你好嗎? #tag #more \ ud83d \ ude2d @foobar,#tagit #tags]括號內的內容,不包括括號,它會像使用英語那樣混亂。 – user170579

+0

這是什麼語言? – Tomas

回答

0

試試這個:

(?:[#@]\S+|\\\S+) 

作品與所有的例子,包括 「亂」 之一。

+0

我會試試看,謝謝!我認爲這可能是一個與php和json_decode有關的問題。 json的一部分看起來像這樣的「文本」:「#emoji convos \ ud83d \ ude2d \ ud83d \ ude2d \ ud83d \ ude2d \ ud83d \ ude02」,但是當我將它傳遞給php中的json_decode()時,瀏覽器,這並不是我得到的,我得到了真正的表情符號字符。在這種情況下,我不知道如何對它執行正則表達式。我只能在解碼json之前做到這一點,但有太多的數據需要這樣做。 – user170579

+0

是的,和我一樣的問題。我相信你的正則表達式會起作用,當我將它與我發佈的純文本進行比較時,似乎是這樣,這是從URL中剔除一些數據的結果。但是,一旦我在php中通過json_decode()傳遞它,數據發生了一些變化。我將不得不探索這裏發生的事情。謝謝。 – user170579

0

json_decode函數會將ascii轉義序列轉換爲實際的utf-8 unicode字符。

$t = "My New Car #wheels #car \ud83d\ude2d\ud83d\ude2d\ud83d\ude2d\ud83d\ude02"; 
$s = json_decode("\"$t\""); 
var_dump($s); 

輸出:

string(40) "My New Car #wheels #car " 

要考慮preg_replace這些字符,你需要打開/u unicode的標誌

$r = preg_replace("/\s*([#@]\S+|[^\\x00-\\xff])\s*/u", "", $s); 
var_dump($r); 

輸出:

string(10) "My New Car" 

\x 0-127(十六進制00-ff)的轉義碼與ascii字符匹配。高於\xff的任何內容都是utf-8特權。