1

正規表現の一致で新しいケースで立ち往生しています...単語、#hashtags、@useranmes、およびその他の文字を含む文字列があります。

ますます乱雑になるいくつかの例。「My New Car」は多くの場合オプションであり、存在しません。これは preg 置換であるため、空の文字列で終わります。私の場合はこれが望ましいです。しかし、'My New Car' が存在する場合は、それが目的の文字列になります。

  1. 私の新しい車 #ホイール #車 #自動車 #ドライブ #週末
  2. 私の新しい車 #wheels #car #auto #drive #weekend @me
  3. 私の新しい車 #wheels, #car, #auto, #drive, #weekend
  4. My New Car #wheels, #car, #auto, #drive, #weekend, @me ( 'My New Car ' を除いた上記のすべて、ダブルスペーシングの通常の混乱など) ( その後、人々は空想を得て、文字列の絵文字で
  5. 私の新しい車 #wheels #car \ud83d\ude2d\ud83d\ude2d\ud83d\ude2d\ud83d\ude02

望ましい結果: 1. 私の新しい車 2. 私の新しい車 3. 私の新しい車 4. 私の新しい車 5. 私の新しい車

私はかなりうまくいってい(^|\s)[#@](\w+)ましたが、絵文字と、\ue412\ue412 として表される面白い四角  が登場しました。

\ remove で始まるかどうかを最後まで言う方法を見つけるだけでよいと思います。逆に[a-zA-Z0-9]以外は否定しようと思ったのですが、これも多言語化。

助言がありますか?

4

2 に答える 2

0

これを試して:

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

「厄介な」ものを含むすべての例で動作します。

于 2011-12-10T00:11:47.560 に答える
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 "

これらの文字を考慮するには、 Unicode フラグpreg_replaceをオンにする必要があります/u

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

出力:

string(10) "My New Car"

\x0 ~ 127 (16 進数 00 ~ ff)のエスケープ コードは、ASCII 文字と一致します。それよりも高いもの\xffは utf-8 文字です。

于 2011-12-10T10:20:56.737 に答える