簡體   English   中英

正則表達式在PHP中查找字符串模式

[英]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,...向后引用。

regex101.com上的示例

*這樣的量詞默認為貪婪

這意味着,要盡可能滿足條件。 例如,在您的示例中,像\\[.*\\]這樣的正則表達式將匹配字符串中從第一個[到最后一個]的所有內容。 要更改默認行為,並使量詞變得懶惰 (不貪心,不情願 ):

  • 使用U (PCRE_UNGREEDY) 修飾符使所有量詞變得懶惰
  • 放一個? 在特定的量詞之后。 例如.*? 盡可能少的字符

1.)使用U- 修飾符 ,模式如下所示:

/\[\[(.*)]\s*\[(.*)]]/Us

Additional使用s(PCRE_DOTALL) 修飾符制作. 點也匹配換行符。 並在示例字符串中的][之間添加了一些\\s空格。 \\s[ \\t\\r\\n\\f]簡寫

然后有兩個捕獲組(.*)要替換。 在regex101.com上測試


2)代替使用? 使每個量詞變得懶惰:

/\[\[(.*?)]\s*\[(.*?)]]/s

在regex101.com上測試


3.)如果沒有方括號,則建議不帶修飾符的[...]

/\[\[([^]]*)]\s*\[([^]]*)]]/

使用^否定字符類 ,以允許[^]]*任何字符量,未]在間[] 這不需要依靠貪婪。 也沒有. 使用,因此不需要s-修飾符。

在regex101.com上測試


根據您的示例替換所有3個示例: <a href="\\1">\\2</a>其中\\1對應第一個括號組的匹配項,...

暫無
暫無

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

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