preg_replace匹配并替换确切的字符数

时间:2014-08-18 09:53:54

标签: php regex preg-replace

如何为此preg_replace添加计数或其他任何内容,以便仅在遇到2或3 >而不是更多或更少的任何内容时才会替换?

原始

$str = '>>This is code>> This is text >>>This is a link>>>. >>>>This need not be replaced>>>>';

$patterns = array('#>>((?!>[^>]).+?)>>#','#>>>((?!>[^>]).+?)>>>#');
$actions = array('[code]$1[/code]','[a]$1[/a]');

echo preg_replace($patterns, $actions, $str );

//output
[code]This is code[/code] This is text >[code]This is a link[/code]>. [code]>>This need not be replaced[/code]>>

预期

[code]This is code[/code] This is text [a]This is a link[/a]. >>>>This need not be replaced>>>>

我在这里要做的是,只匹配>>>>>而不是其他任何东西,比如字符串中的第三个。我目前最终做的是匹配那里的每个人。

我尝试将{2}{3}添加到$patterns,如下所示:

$patterns = array('#>>{2}((?!>[^>]).+?)>>{2}#','#>>>{3}((?!>[^>]).+?)>>>{3}#');

但这只是进一步破坏了事情。

我打算稍后在那里添加更多模式,那么我怎样才能告诉正则表达式只查找2或3 >(或更多以后)而不只是查找字符串中的所有>?< / p>

2 个答案:

答案 0 :(得分:2)

$str = '>>This i>s code>> This is text
>>>This is >> a li>nk>>>.
>>>>This need not be replaced>>>>
>>Bad > stuff>>>
';

$patterns = array(
    '#(?<!>)(>{2})(?!>)(.*?)(?<!>)\1(?!>)#',
    '#(?<!>)(>{3})(?!>)(.*?)(?<!>)\1(?!>)#',
    );
$actions = array('[code]$2[/code]','[a]$2[/a]');

echo preg_replace($patterns, $actions, $str );

答案 1 :(得分:1)

试试这个

$str = '>>This is code>> This is text >>>This is a link>>>. >>>>This need not be replaced>>>>';

$patterns = array('#>>>>(.+?)>>>>#', '#>>>([^>].+?)>>>#', '#>>([^>].+?)>>#');
$actions = array('$1', '[a]$1[/a]', '[code]$1[/code]');

输出:

[code]This is code[/code] This is text [a]This is a link[/a]. This need not be replaced