簡體   English   中英

"此正則表達式模式的更優雅(更短)的解決方案"

[英]More elegant (shorter) solution for this regex pattern

我花了三天時間研究如何找到一個單一的解決方案來匹配單引號或雙引號與實際源字符串中的轉義單引號或雙引號之間的任何內容,並在不單獨觸及目標引號的情況下替換匹配的文本..我認為我成功了。 多行或單行 - 它有效。 也就是說,此正則表達式可用於在任何源代碼 *(例如: file_get_contents ('some_class.php') )中更改/更改/清理'text'"text"或字符串,並保持其他所有內容不變,假設在此操作之前已刪除代碼注釋。

這是用單引號包裹的正則表達式..

'@"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'@msu'

.. 這是用雙引號括起來的正則表達式。

"@\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"|'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'@msu"

它與這樣的源代碼完美匹配......

// Very nasty php array 

$Damn = [

  'a' => "' lorem ipsum '",

  'b' => '"\" ipsu\'m lorem  ',

  'c' => " \' YabadabaDooya \" ",

  'd\"' => ' 

     f"

     o\'"o  

                 \'bar" ',

  'e' => "'",

  "f" => '"'

];

由於這按我的預期工作,而且我實際上不是 PCRE 大師(不要問我過去三天有多少“痛苦”D:直到我想出這個解決方案),如果有人知道如何,並且願意通過將上述正則表達式縮小為更優雅/更短的解決方案來提供幫助,那將是極好的。 我假設| (或)在模式的中間可以放在開頭,就一次..我試過上帝只知道什么..來完成它,但沒有運氣。

所以,一般的問題是 - 上述模式的較短變體看起來如何?

如果您在引號前為反斜杠添加否定的后視,那么它將跳過轉義的引號。

$re = '/((?<![\\\\])["\'])([\s\S]*?)((?<![\\\\])\1)/';

在這里測試

我要感謝先生。 Wahyu Kristianto<\/strong>提出了比我更優雅、更智能的解決方案。

這是他的正則表達式。

它是-完美的-之一。

正是<\/strong>我要找的東西。 使用額外的正則表達式選項,它可以得到相當優化和瘋狂的性能。 :)

不僅如此,只需在第一個字符組中添加一個反引號,正則表達式也將匹配單引號、雙引號和反引號,並且只需要在一個地方進行更改。

我認為它不能比這更體面和清潔。 也許我錯了。 但我對此表示懷疑。

Wahyu先生,你真棒<\/strong>。 :)))

暫無
暫無

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

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