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

时间:2011-05-16 05:24:47

标签: regex

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

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

我想只获取作为参数传递给__()函数的字符串。我试过这个正则表达式:

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

但是返回'string1'和“string2”包装在单引号和双引号中 如何排除单引号和双引号?

4 个答案:

答案 0 :(得分:2)

  • 适当使用(?: )。这些是用于您不想捕获的分组。
  • 如果您在捕获( )中有引号,那么引号将包含在捕获中。如果你把引号放在外面,那么就不会包括它们。
  • 您的( )比您需要的多|[^']具有最低优先级。
  • 你逃避的比你需要的多。报价不需要被删除。
  • 由于您使用的是[^"]'/__\((?:'([^']+)|"([^"]+))/' ,因此您无需指定关闭引号/ parens。

修复就像:

{{1}}

答案 1 :(得分:2)

试试这个

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

你可以看到它online here on Regexr

每次打开圆括号时,都会创建一个捕获组。因此,如果您不希望它使用(?:),则会定义非捕获组。我不在这里使用它。我重写了你的正则表达式。在我的第一个组中,我检查是否有'"并将它们存储到组1中。稍后我将反向引用\1存储到该组中,以使用正确的字符。< / p>

然后,您的结果将始终存储到第2组中。您如何访问此结果取决于您使用的语言。

答案 2 :(得分:1)

您可以使用Lookahead and Lookbehind或将引号内的字符串作为一个组。

答案 3 :(得分:0)

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