[英]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.