0

我需要能够替换*hello*somethinghellosomething. 我可以用 regex 做到这一点#\*(.*?)\*#。问题是,我想忽略任何带有**hello**. 我已经尝试过#\*([^\s].*?)\*#,它在哪里工作,但返回*somethinghellosomething*,而不仅仅是**hello**. 我需要在我的表达式中添加什么,以确保它不会替换任何**封装的字符串?

4

3 回答 3

4

您可以尝试环视断言以仅在没有在另一个之前或之后进行匹配*

(?<!\*)\*([^*]+)\*(?!\*)

另外,请注意,我将您的更改.*?[^*]+. 否则,它可以匹配两个连续的星号,因为.*?可以匹配nothing

示例:http ://regexr.com?33sp0


一块一块的,是这样的:

(?<!\*)    # 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 回答