[英]Regular expression to find pattern in string in PHP
假設我有一個看起來像這樣的字符串:
"lets refer to [[merp] [that entry called merp]] and maybe also to that entry called [[blue] [blue]]"
這里的想法是用<a href="name.html">some text</a>
替換[[name][some text]]
的塊。
因此,我試圖使用正則表達式來查找類似於[[name][some text]]
,但是我遇到了很大的困難。
這是我認為應該工作的(在PHP中): preg_match_all('/\\[\\[.*\\]\\[.*\\]/', $my_big_string, $matches)
但這僅返回一個匹配項,即從'[[merp'
到'blue]]'
的字符串。 如何獲得返回兩個匹配項[[merp][that entry called merp]]
和[[blue][blue]]
?
您要查找的正則表達式為\\[\\[(.+?)\\]\\s\\[(.+?)\\]\\]
並替換為<a href="$1">$2</a>
捕獲在()
大括號內匹配的正則表達式模式,可以使用$ 1,$ 2,...向后引用。
這意味着,要盡可能滿足條件。 例如,在您的示例中,像\\[.*\\]
這樣的正則表達式將匹配字符串中從第一個[
到最后一個]
的所有內容。 要更改默認行為,並使量詞變得懶惰 (不貪心,不情願 ):
U (PCRE_UNGREEDY)
修飾符使所有量詞變得懶惰 ?
在特定的量詞之后。 例如.*?
盡可能少的字符 1.)使用U- 修飾符 ,模式如下所示:
/\[\[(.*)]\s*\[(.*)]]/Us
Additional使用s(PCRE_DOTALL) 修飾符制作.
點也匹配換行符。 並在示例字符串中的][
之間添加了一些\\s
空格。 \\s
是[ \\t\\r\\n\\f]
的簡寫 。
然后有兩個捕獲組(.*)
要替換。 在regex101.com上測試
2)代替使用?
使每個量詞變得懶惰:
/\[\[(.*?)]\s*\[(.*?)]]/s
3.)如果沒有方括號,則建議不帶修飾符的[...]
。
/\[\[([^]]*)]\s*\[([^]]*)]]/
使用^
否定字符類 ,以允許[^]]*
任何字符量,未]
在間[
和]
。 這不需要依靠貪婪。 也沒有.
使用,因此不需要s-修飾符。
根據您的示例替換所有3個示例: <a href="\\1">\\2</a>
其中\\1
對應第一個括號組的匹配項,...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.