从正则表达式的字符串中获取变量

时间:2011-05-17 15:53:25

标签: php regex preg-match

我对正则表达式感到疯狂。我有一个这样的字符串:

%closed% closed (%closed_percent%\%), %open% open (%open_percent%\%)

我需要的是一个与以下内容匹配的正则表达式:

%closed%
%closed_percent%
%open%
%open_percent%

但不是两个\%

目前我使用:

\%([^\%]+)\%

给了我:

%closed%
%closed_percent%
%), %
% open (%
...

任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:2)

简单的方法:

%\w+%

匹配:%foo%

允许(多个)反斜杠转义:

(?<!\\)(?:\\.)*%(\w+)%

仅匹配bar中的\%foo% \\%bar% \\\%baz%

...这也允许它内部的转义:

(?<!\\)(?:\\.)*%((?:[^\\%\s]+|\\.)+)%

匹配:%foo\%bar%

使用第一个捕获组的值和最后两个表达式。

答案 1 :(得分:1)

试试这个:

\%([^(\\\%)]+?)\%

匹配

%closed%
%closed_percent%
%open%
%open_percent%

对我来说。

答案 2 :(得分:1)

假设对百分比包装标记(包括转义字符)中的内容没有限制,以及可以转义哪些字符(因此反斜杠也可以转义:\\%token%应该有效),
 这是一个可以用来跳过转义字符的模式:

\\.|(%([^%\\]|\\.)+%)

这将捕获百分比包装的标记,并将在第一组($1)中捕获它们。转义的字符也将匹配(这是跳过它们的一个很好的技巧),但使用PHP很容易得到相关的标记:

preg_match_all('/\\\\.|(%([^%\\\\]|\\\\.)+%)/', $str, $matches, PREG_PATTERN_ORDER);
$matches = array_filter($matches[1]);

工作示例:http://ideone.com/dziCB

答案 3 :(得分:0)

尝试:

~\%\w+\%~

因此,在您的选择中只允许使用a-z A-Z和_。

$str = "%closed% closed (%closed_percent%\%), %open% open (%open_percent%\%)";

preg_match_all("~\%\w+\%~", $str, $matches);

$matches现在包含:

Array
(
    [0] => Array
    (
        [0] => %closed%
        [1] => %closed_percent%
        [2] => %open%
        [3] => %open_percent%
    )
)

答案 4 :(得分:0)

为反斜杠添加负面的lookbehinds!这样就会忽略\%

(?<!\\)\%([^\%]+)(?<!\\)\%

匹配

  

%关闭%

     

%closed_percent%

     

%打开%

     

%open_percent%