我想使用regex和preg_replace函数进行替换.这是我的代码
$verif = "/wordA(\s*)wordB(?! wordc)/i";
$replacement = 'wordA wordb wordc';
$newvar = preg_replace($verif, $replacement, $article->text);
Run Code Online (Sandbox Code Playgroud)
如果我们在wordA和wordB之间只有一个空格,那就有效.我需要匹配wordA和wordB之间的空格数量.
例:
wordA(10个或更多个空格)wordB - > wordA wordb wordc同一个字A(1个空格)wordB - > wordA wordb wordc ...
aca*_*lon 17
你的正则表达式应该"按原样"工作.假设它正在做你想要的.
wordA(\s*)wordB(?! wordc)
Run Code Online (Sandbox Code Playgroud)
这意味着匹配wordA后跟0或更多空格后跟wordB,但如果后跟则不匹配wordc.注意单个空格?!和wordc哪个意味着wordA wordB wordc不匹配,但wordA wordB wordc会.
以下是一些示例匹配和关联的替换输出:

请注意,无论空格多少,都会替换所有匹配项.还有其他几点: -
(?! wordc)是一个负前瞻,所以你不会匹配wordA wordB wordc假定的线(并且是最后一行不匹配的原因).目前,你依靠空格?!来匹配空格.您可能希望更精确和使用(?!\swordc).如果你想在wordc之前匹配多个空格,你可以使用(?!\s*wordc)0或更多空格或(?!\s*+wordc)1个或多个空格,具体取决于你的意图.
当然,如果你想在wordB之后用wordc匹配行,那么你不应该使用负向前瞻.
*将匹配0或更多空格,以便它匹配wordAwordB.您可能需要考虑+是否需要至少一个空格.
(\s*) - 括号表示捕获组.您是否因为某种原因将空白捕获到组中?如果没有,你可以删除括号,即只需使用\s.
根据评论更新
你好问题不是表达式,而是HTML输出不被视为空格.这是一个Joomla网站.
保留原始正则表达式,您可以使用:
wordA((?:\s| )*)wordB(?!(?:\s| )wordc)
Run Code Online (Sandbox Code Playgroud)
唯一的区别是正则表达式不匹配空格OR .我更换了wordc,\swordc因为那更明确.注意:正如我已经指出,排除模式?!会不会当wordB后跟一个空格和wordc匹配.如果您想匹配多个空格,请参阅上面的评论.我还保留了空白周围的捕获组,如果你不想这样,那么删除括号,如上所述.
示例匹配:

我使用 a 而不是“*”的原因+是因为加号被定义为一个或多个前面的元素,其中星号为零或多个。在这种情况下,我们需要一个更具体的分隔符,即“一个或多个”空格。
word[Aa]\s+word[Bb]\s+word[Cc]
Run Code Online (Sandbox Code Playgroud)
将匹配:
wordA wordB wordC
worda wordb wordc
wordA wordb wordC
Run Code Online (Sandbox Code Playgroud)
此表达式中的单词必须具体,并且按顺序排列(a、b,然后 c)