我需要能够替换*hello*
为somethinghellosomething
. 我可以用 regex 做到这一点#\*(.*?)\*#
。问题是,我想忽略任何带有**hello**
. 我已经尝试过#\*([^\s].*?)\*#
,它在哪里工作,但返回*somethinghellosomething*
,而不仅仅是**hello**
. 我需要在我的表达式中添加什么,以确保它不会替换任何**
封装的字符串?
问问题
73 次
3 回答
4
您可以尝试环视断言以仅在没有在另一个之前或之后进行匹配*
。
(?<!\*)\*([^*]+)\*(?!\*)
另外,请注意,我将您的更改.*?
为[^*]+
. 否则,它可以匹配两个连续的星号,因为.*?
可以匹配nothing。
一块一块的,是这样的:
(?<!\*) # not preceded by an asterisk
\* # an asterisk
([^*]+) # at least one non-asterisk character
\* # an asterisk
(?!\*) # not followed by an asterisk
于 2013-02-23T20:31:19.813 回答
0
试试这个
#(\*+)(.*?)(\*+)#
示例代码
$notecomments=" **hello** *hello* ***hello*** ****hello**** ";
$output=preg_replace_callback(array("#(\*+)(.*?)(\*+)#"),function($matches){
if($matches[1]=="*")
return 'something'.$matches[2].'something';
else
return $matches[0];
},' '.$notecomments.' ');
输出:
**hello** somethinghellosomething ***hello*** ****hello****
于 2013-02-23T20:43:55.783 回答
0
$text = '**something** **another** *hello*';
function myfunc($matches)
{
if($matches[0][0] == '*' && $matches[0][1] == '*'){
return $matches[0];
}else{
return str_replace('*', 'something', $matches[0]);
}
}
echo preg_replace_callback("/(\*){1,2}([^*]+)(\*){1,2}/","myfunc", $text);
于 2013-02-23T20:49:58.537 回答