我想知道如何在匹配模式后从结果中排除子字符串。 例如:
<a href="?page1"><?php __('string1');?></a>
<a href="?page2"><?php __("string2");?></a>
我想只获取作为参数传递给__()函数的字符串。我试过这个正则表达式:
'/__\(((\'([^\']+)\')|(\"([^\"]+)\"))/'
但是返回'string1'和“string2”包装在单引号和双引号中 如何排除单引号和双引号?
答案 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)