Php 是否使用正则表达式查找未注释的字符串?

Php 是否使用正则表达式查找未注释的字符串?,php,regex,comments,Php,Regex,Comments,我想要一个正则表达式来查找任何给定的字符串,但前提是它没有使用单行注释进行注释 如果字符串在多行注释中,我不介意它是否会找到它(因为除此之外,我认为正则表达式会非常复杂) 例如,asumming I want“mystring”(不带引号): mystring bla bla bla$example是您在字符串中提供的示例 <?php // Remove multiline comments $no_multiline_comments = preg_replace('/\/\*.*?

我想要一个正则表达式来查找任何给定的字符串,但前提是它没有使用单行注释进行注释

如果字符串在多行注释中,我不介意它是否会找到它(因为除此之外,我认为正则表达式会非常复杂)

例如,asumming I want“mystring”(不带引号):


mystring bla bla bla$example是您在字符串中提供的示例

<?php 

// Remove multiline comments
$no_multiline_comments = preg_replace('/\/\*.*?\*\//s', '', $text);

// Remove single line comments
$no_comments = preg_replace("/\/\/.*?\n/", "\n", $no_multiline_comments);

// Find strings
preg_match_all('/.*?mystring.*?\n/', $no_comments, $matches);

var_dump($matches);

如果lookbehinds可以接受不确定的wifth表达式,那么您可以在PHP中使用lookbehind,但实际上并不需要lookbehinds:)lookbehind可以:

^(?:(?!//).)*?\Kmystring

\K
重置匹配

如果您突然想通过说您不希望该部分包含在块注释中来进一步推动这一点,您可以使用更多的lookahead:

^(?:(?!//).)*?\Kmystring(?!(?:(?!/\*)[\s\S])*\*/)


增编:

如果您还希望在同一行中获取多个
mystring
,请将
^
替换为
(?:\G|^)


\G
在上一场比赛结束时匹配。

有人试图解决这个问题吗?没有,我想我必须使用“lookbehinds”,但我不知道确切的方法。@DiegoDD仔细阅读了一下。试试看。返回此处报告结果/问题。尝试
(?但仅排除
//mystring
,而不是
//blablablamystring
。尝试
(?但排除所有内容。同时
(但不匹配我需要的部分。我错过了告诉它在<代码> //< /代码>和<代码> MyStudio<代码>之间的任何部分,所以它将排除<代码> //BLA-BLA MyStult。这是我的尝试。您是否考虑过使用递归PCRE,首先排除注释()?,然后匹配字符串?+1是的,这也行。只要确保删除多行注释不是贪婪的。如果文件中有几个,将有大量的字符可能不应该被替换,被替换。更新的答案修复了贪婪的问题。不过我会使用Jerry的答案。这太棒了8)!对不起,如果我之前没有说清楚,我只需要正则表达式,这样我就可以在我的代码编辑器(当前为notepad++)中使用它来搜索当前文件中的文本。我不需要替换任何内容、存储任何内容、报告任何内容,我只需要在notepad++中的“查找”对话框中使用一个简单的正则表达式,然后按“find next”(或F3)在结果之间跳转,并决定在每种情况下要做什么。这似乎非常有效!我以前从未见过
\K
运算符(或其他任何运算符)。它是标准的,还是取决于正则表达式实现?我在Notepad++中使用它来搜索字符串,它可以工作!但我不知道它是否可以在其他实现中工作,因为再次强调,K对我来说是全新的。谢谢!@DiegoDD它不能在所有正则表达式实现中工作。我知道它在PCRE/PHP/Perl中工作,在t中将在Python中工作我认为它在C#/Ruby/VBA中还不能工作,但在Java/Javascript上肯定不能工作。很高兴它起到了作用:)
^(?:(?!//).)*?\Kmystring
^(?:(?!//).)*?\Kmystring(?!(?:(?!/\*)[\s\S])*\*/)
^(?s)(?:(?!//).)*?\Kmystring(?!(?:(?!/\*).)*\*/)