正则表达式匹配任何空格

use*_*311 19 php regex

我想使用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匹配.如果您想匹配多个空格,请参阅上面的评论.我还保留了空白周围的捕获组,如果你不想这样,那么删除括号,如上所述.

示例匹配:

在此输入图像描述


mrr*_*es1 2

我使用 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)

  • 管道在字符类中没有特殊含义,它是一个文字字符。字符类只是一组字符。编写“[A|a]”与“[|aA]”或“[aA|]”完全相同。您可以将其替换为“[aA]”,或者为什么不替换为“(?:a|A)”。 (2认同)