我必须在一个句子中搜索并替换所有以@和#开头的单词。能告诉我在PHP中执行此操作的最佳方法吗?我试过
preg_replace('/(\@+|\#+).*?(?=\s)/','--', $string);
这将只能解决一个句子中的一个单词。我希望所有的比赛都被替换。
我不能在g
这里像perl一样。
答案 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)[@#].*$/