0

*hello*に置き換えることができる必要がありますsomethinghellosomething。regex でこれを行うことができます#\*(.*?)\*#。問題は、 を無視したいということです**hello**。私は試してみましたが、それはある程度機能しますが、 ではなく を#\*([^\s].*?)\*#返します。エンケースされた文字列を置換しないようにするには、式に何を追加する必要がありますか?*somethinghellosomething***hello****

4

3 に答える 3

4

ルックアラウンドアサーションを試して、前後に別のがない場合にのみ一致させることができ*ます。

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

.*?また、あなたをに変更したことに注意してください[^*]+.*?それ以外の場合は、何にも一致しない可能性があるため、2つの連続するアスタリスクに一致する可能性があります。

例: 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 に答える