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

时间:2013-04-24 12:07:57

标签: php regex parsing html-parsing substitution

我需要一个能够匹配"%"内部的正则表达式。标记在以下字符串中:

  

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

即使表格是这样的:

  

2)Bla bla bla%yada 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

所以在第二次通话中,我没有得到匹配。希望这会有所帮助。

4 个答案:

答案 0 :(得分:1)

查看您对preg_match的来电...第二个参数应为$subject而不是$search ...

另外,使用return实际返回内容,而不是echo

答案 1 :(得分:1)

%.*%

这将匹配

1)a%

2)任意数量的任何字符

3)a%

因为它会贪婪地而不是懒惰地匹配,它将匹配最宽的%...%它可以,而不是停在第一个。

例如,懒惰的版本将是%。*?%(在*之后放置?使其变得懒惰)并且它将在第一个之后关闭,而不是最后一个%。

答案 2 :(得分:0)

/%.+?%/应该做到这一点 看到正则表达式的贪婪。
[^%]在第一个%停止。但是你想要在两个%之间包含所有字符。

答案 3 :(得分:0)

试试这个表达

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

希望有所帮助