正则表达式。如何在匹配模式后从结果中排除子字符串

8

我想知道如何在匹配模式后从结果中排除子字符串。 例如:

<a href="?page1"><?php __('string1');?></a>
<a href="?page2"><?php __("string2");?></a>

我希望仅获取作为参数传递给__()函数的字符串。 我尝试了这个正则表达式:

'/__\(((\'([^\']+)\')|(\"([^\"]+)\"))/'

但这会返回用单引号和双引号括起来的'string1'和"string2"。如何排除其中的单引号和双引号?

我和@ahmedhelmy007私下讨论了这个问题,我们找到了另一个解决方案,即使用php中的token_get_all()函数。这比正则表达式更准确且更快。 - Shreef
4个回答

3
您想尝试使用非捕获组 - (?:ABC)

2
你可以使用前瞻和后顾或将引号内的字符串作为一个组。

2
  • 适当使用(?: )。这些是用于分组但不想捕获的。
  • 如果你将引号放在捕获( )内部,则引号将包含在捕获中。如果你将引号放在外面,则它们将不会被包含。
  • 你有比需要更多的( )|在关联中具有最低优先级。
  • 你转义的内容比实际需要的要多。引号不需要转义。
  • 由于你正在使用[^'][^"],因此你不必指定关闭引号/括号。

修复如下:

'/__\((?:'([^']+)|"([^"]+))/'

0

试试这个

'/__\(('|")([^\1]+)\1\)/'
       ^1^  ^^2^^^

你可以在Regexr上在线查看它

每次打开一个圆括号时,都会创建一个捕获组。因此,如果您不想使用它,请使用(?:)来定义非捕获组。我这里没有使用它。我稍微改写了你的正则表达式。在我的第一组中,我检查是否有'"并将它们存储到组1中。然后我使用回溯引用\1到这个组1,以使用正确的字符。

您的结果始终存储在组2中。如何访问此结果取决于您使用的语言。


@stema, 你的正则表达式非常强大,特别是反向引用功能。但是在PHP中我无法正确地使用它!! 我使用preg_match_all:preg_match_all('/__\((\'|")([^\1]+)\1\)/', $text, $matches);我认为反向引用需要在范围括号内做些调整才能正常工作。 - ahmedhelmy007
@ahmedhelmy007,我不是 PHP 专家,但我尝试了一下,似乎你需要转义 '",所以请尝试使用这个正则表达式。'/__\((\'|\")([^\1]+)\1\)/' - stema
@stema,不是转义问题。 - ahmedhelmy007
有没有 PHP 极客能告诉我这里反向引用的问题是什么? 简而言之,我需要让它工作: preg_match_all('/(('|")([^\1]+)\1/', "('match this') . 'not this'", $matches); - ahmedhelmy007
@ahmedhelmy007,这里只有少数人会阅读您的评论。我建议您提交一个新问题来解决这个问题。同时添加调用正则表达式的代码,并将标签设置为“php”,我相信您很快就会得到很好的答案。 - stema
@stema,谢谢你,我已经添加了这个问题: http://stackoverflow.com/questions/6050427/regex-problem-with-backreference-in-pattern-with-preg-match-all - ahmedhelmy007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接