匹配第一个%之后和最后一个%之前的正则表达式



我需要一个正则表达式,可以匹配以下字符串中"%"标记内的内容:

1) Bla Bla Bla %yada yada yada% Bla Bla。

即使格式是这样的:

2) Bla Bla Bla %yada yada% Bla Bla %yada #1 yada%

我认为/%([^%]*)%/可以,但在第二种情况下,它不匹配第二部分(%yada #1 yada%),只有第一个。

表达式必须匹配,即使"%"标记之间的子字符串包含类似"#1"的内容。提前谢谢你

function replace($search, $replace, $subject, $link)
    {
        if (preg_match('/#[1-9]/', $search) == 1 && $link == null)
        {
            echo preg_replace($search, $replace, $subject);
        }
        if (preg_match('/%[a-zA-Z0-9# ]+%/', $search) == 1 && $link != null && $replace == null)
        {
            echo preg_replace('/%[a-zA-Z0-9# ]+%/', '<a href=$link>$1</a>', $subject, 1) . '<br>';
        }
    }
$string = 'bla bla #1 bla bla %bla bla% bla #2 %bla bla #3 bla%';
$newString = replace('/%[a-zA-Z0-9# ]+%/', null, $string, 'www.google.com');
echo $newString;
preg_match('/%[a-zA-Z0-9# ]+%/', $newString)); // 0 = no match

所以在第二次调用中我没有得到匹配。

%.*%

匹配

1) a % 2)任意数量的任意字符 3) a %

由于它将贪婪匹配而不是懒惰匹配,因此它将匹配最宽的%…

例如,它的惰性版本是%.*?put ?在a *之后会使它变懒),并且它会在第一个%之后关闭,而不是在最后一个%之后。

查看您对preg_match的呼叫…第二个参数应该是$subject而不是$search

另外,使用return来实际返回一些东西,而不是echo

/%.+?%/应该可以做到。
参见正则表达式的贪婪性。
[^%]停在第一个%。但是您希望包含两个%之间的所有字符。

试试这个表达式

%[a-zA-Z0-9# ]*%

希望有所帮助

最新更新