簡體   English   中英

用於匹配所有的PHP正則表達式模式

[英]PHP regex pattern for matching all

我的應用程序中有一個類似facebook的提及功能。

在創建帖子或評論時,用戶可以使用@符號提及其他用戶。 我使用以下jQuery插件: http//podio.github.com/jquery-mentions-input/

提及的格式如下:@@ [Marko Kurjonen:2] so“@@ [User name'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,馬可

你可以使用這個正則表達式:

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

此正則表達式假定名稱不包含:字符。

原始正則表達式有兩個問題:

  • 最后的空間,剛好在]之后,導致第二次提及無法匹配,因為它位於輸入的末尾。 (如果你刪除它,貪婪的量詞將吞噬整個輸入字符串。)
  • * in (.*) 貪婪地匹配0個或更多實例,這意味着它將匹配盡可能多的字符,直到下一個令牌無法匹配,它將回溯並嘗試匹配下一個令牌。 這就是為什么如果你移除空間,整個輸入字符串將被吞噬,如上所述。

也可以修改你的正則表達式使它工作(除了我上面提到的解決方案):

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

m標志和i標志在這里沒用,所以我刪除了它們。 你永遠不會在你的正則表達式中使用^$ ,所以m標志是沒用的。 只有正則表達式中有字母時 i標志才有用,這不是這里的情況。

我用*? 這里是量詞,這是匹配0或更多的懶惰版本。 它將匹配盡可能少的字符,僅用於匹配的下一個標記。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM