繁体   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