preg_replace 不替换某些匹配的字符串

preg_replace not replacing certain matching strings

我想在字符串中的每个单词前面加上一个 +,除非单词以 * 开头。

以下是我在每个单词前加上 + 的做法:

$string = "    *these are my words   ";
$trimmed = trim($string);
$pattern = '/ /';
$string2 = preg_replace ($pattern, ' +',$trimmed);

如何避免 preg_replace 在每个带有 * 的单词前加上 +?

谢谢

您可以尝试以下基于负向回顾的正则表达式。

preg_replace('~(?<!\S)([^*\s])~', '+', $str);
  • (?<!\S) 匹配每个单词开头存在的所有边界。这里的单词表示一个或多个非space字符。

  • ([^*\s]) 匹配匹配边界旁边存在的单个字符,该字符不能是 space 字符或 * 符号。

  • 现在它将匹配的字符替换为 + 加上第一个捕获组中存在的字符。

DEMO

preg_replace('~(^|\s)([^*\s])~', '+', $str);

DEMO