0

私のアプリにはFacebookのような言及機能があります。

投稿やコメントを作成するとき、ユーザーは@記号で他のユーザーに言及できます。私は次のjQueryプラグインを使用しています:http://podio.github.com/jquery-mentions-input/

メンションは次の形式で生成されます:@@ [Marko Kurjonen:2] so "@@ [User's name:user_id]

現在、私は次のパターン(およびコード)を持っています:

$pattern = "/@@\[(.*):(\d*)] /ims";

$matches = array();
preg_match_all($pattern, $input, $matches);
Zend_Debug::dump($matches);
$output = preg_replace($pattern, "<a href=\"". $this->view->baseUrl("user") ."/$2\" class=\"tooltip\">$1</a>", $input);

問題は、最初の言及しか行わないことです。

文字列の例:

$input = "Hello @@[Markku Pelkonen:7] and @@[Marko Kurjonen:2]"

最初のユーザーのみがpreg_replaceによって変換されます。

br、マルコ

4

1 に答える 1

2

この正規表現を使用できます:

/@@\[([^:]*):(\d*)\]/

この正規表現は、名前に文字が含まれていないことを前提としています:

元の正規表現には2つの問題があります。

  • の直後の最後のスペースは]、入力の最後にあるため、2番目の言及が一致しない原因になります。(これを削除すると、貪欲な数量詞が入力文字列全体を飲み込んでしまいます。)
  • *inは、0(.*)個以上のインスタンスに貪欲に一致します。つまり、次のトークンが一致しなくなるまで、可能な限り多くの文字に一致します。次のトークンは、バックトラックして次のトークンに一致しようとします。これが、前述のように、スペースを削除すると入力文字列全体がぐちゃぐちゃになる理由です。

正規表現を少し修正して機能させることもできます(上記の解決策は別として):

/@@\[(.*?):(\d*)]/s

ここではm旗とi旗は役に立たないので、削除します。正規表現で^またはを使用することはないため、フラグは役に立ちません。フラグは、正規表現に文字がある場合にのみ役立ちますが、ここではそうではありません。$mi

*?ここでは、一致0以上の遅延バージョンである数量詞を使用します。次のトークンが一致するためだけに、可能な限り少ない文字と一致します。

于 2012-08-07T06:25:42.343 に答える