3

文中の@と#で始まるすべての単語を検索して置き換える必要があります。PHPでこれを行うための最良の方法を教えてください。で試してみました

preg_replace('/(\@+|\#+).*?(?=\s)/','--', $string);

これにより、1つの文の1つの単語のみが解決されます。すべての試合を置き換えてほしい。

私はgここでperlのようにできません。

4

3 に答える 3

2

preg_replaceデフォルトですべての一致を置き換えます。そうでない場合は、パターンまたはデータに問題があります。

代わりに次のパターンを試してください。

(?<!\S)[@#]+\w+

(?<!\S)-パターンの前に空白以外の文字が付いている場合は一致しません。

[@#]+-1つ以上の@とに一致し#ます。

\w+-1つ以上の単語文字(文字、数字、アンダースコア)に一致します。これにより、句読点が保持されます。たとえば、@foo.はに置き換えられ--.ます。これが必要ない場合は、\S+代わりに、空白以外のすべての文字に一致するを使用できます。

于 2013-03-27T12:17:31.050 に答える
1

これを試して :

  $string     = "@Test let us meet_me@noon see #Prasanth";
  $new_pro_name = preg_replace('/(?<!\S)(@\w+|#\w+)/','--', $string);
  echo $new_pro_name;

@これにより、 ORで始まるすべての単語が置き換えられます#

出力:-- let us meet_me@noon see --

@ORの後に単語を置き換えたい場合#は、単語の途中であっても。

  $string     = "@Test let us meet_me@noon see #Prasanth";
  $new_pro_name = preg_replace('/(@\w+|#\w+)/','--', $string);
  echo $new_pro_name;

出力:-- let us meet_me-- see --

于 2013-03-27T12:14:10.230 に答える
1

文字で始まる単語は、この文字の直前にスペースがあることを意味します。そのようなことを試してください:

/(?<!\S)[@#].*(?=[^a-z])/

使ってみません(?=\s)か?なぜなら、単語の直後に句読点がある場合、それは単語の一部ではないからです。注:[^a-z]単語内の許可されていない文字のリストに置き換えることができます。

ただし、それが機能しない2つの特定のケースがありますので注意してください。3つ続けて使用する必要がありますpreg_replace。他の2つは、文字列の開始と終了を表す単語用です。

/^[@#].*(?=[^a-z])/
/(?<!\S)[@#].*$/
于 2013-03-27T12:14:54.610 に答える