如何使用搜索并替换php中句子中的所有匹配单词

时间:2013-03-27 12:03:40

标签: php regex preg-replace

我必须在一个句子中搜索并替换所有以@和#开头的单词。能告诉我在PHP中执行此操作的最佳方法吗?我试过

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

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

我不能在g这里像perl一样。

3 个答案:

答案 0 :(得分:2)

默认情况下,

preg_replace会替换所有匹配项。如果不这样做,那么您的模式或数据就会出现问题。

请尝试使用此模式:

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

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

[@#]+ - 匹配@#中的一个或多个。

\w+ - 匹配一个或多个单词字符(字母,数字,下划线)。这将保留标点符号。例如,@foo.将替换为--.。如果你不想这样,你可以改用\S+,它匹配所有不是空格的字符。

答案 1 :(得分:1)

试试这个:

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

这会替换以@#

开头的所有字词

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

如果您想在@#之后替换单词,即使它位于单词的中间位置。

  $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 --

答案 2 :(得分:1)

带有字符的单词开始表示它在此字符前面有一个空格。尝试类似的东西:

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

为什么不使用(?=\s)?因为如果在单词后面有一些ponctuation,它不是单词的一部分。注意:您可以将[^a-z]替换为单词中任何不允许使用的字符列表。

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

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