如何为此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>
答案 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