3

我必须搜索并替换句子中所有以 @ 和 # 开头的单词。您能否让我知道在 PHP 中执行此操作的最佳方法。我试过了

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

这将只解决一个句子中的一个单词。我希望所有的比赛都被替换。

我不能g像在 perl 中一样。

4

3 回答 3

2

preg_replace默认替换所有匹配项。如果不这样做,则说明您的模式或数据存在问题。

试试这个模式:

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

(?<!\S)- 如果模式前面有非空白字符,则不匹配。

[@#]+- 匹配一个或多个@and #

\w+- 匹配一个或多个单词字符(字母、数字、下划线)。这将保留标点符号。例如,@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]单词中任何不允许的字符列表替换。

但要小心,有两种特殊情况不起作用。您必须preg_replace连续使用 3 个,另外两个用于字符串开头和结尾的单词:

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