正则表达式匹配任何空格

2022-08-30 10:02:59

我想使用正则表达式和preg_replace函数进行替换。这是我的代码

$verif = "/wordA(\s*)wordB(?! wordc)/i";
$replacement = 'wordA wordb wordc';
$newvar = preg_replace($verif, $replacement, $article->text);

如果我们在 wordA 和 wordB 之间只有一个空格,这是有效的。我需要匹配wordA和wordB之间的空格数量。

例:

wordA(10 个或更多空格) wordB -> wordA wordb wordc 相同的单词 A(1 个空格) wordB -> wordA wordb wordc ...


答案 1

您的正则表达式应按“原样”工作。假设它正在做你想要它做的事情。

wordA(\s*)wordB(?! wordc)

这意味着匹配后跟 0 个或更多空格,后跟 ,但如果后跟 。则不匹配。请注意 和 之间的单个空格,这意味着 它将不匹配,但会匹配。wordAwordBwordc?!wordcwordA wordB wordcwordA wordB wordc

以下是一些匹配项和关联的替换输出示例:

enter image description here

请注意,无论有多少个空格,都会替换所有匹配项。还有其他几点: -

  • (?! wordc)是一个负面的展望,所以你不会匹配假设是有意的行(这就是为什么最后一行不匹配)。目前,您依靠后面的空格来匹配空格。您可能希望更精确并使用 .如果要在 wordc 之前匹配多个空格,则可以使用 0 个或更多空格,也可以用于 1 个或更多空格,具体取决于您的意图。当然,如果你确实想在wordB之后将行与wordc匹配,那么你不应该使用负面的后瞻。wordA wordB wordc?!(?!\swordc)(?!\s*wordc)(?!\s*+wordc)

  • *将匹配 0 个或更多空格,以便匹配 wordAwordB。您可能需要考虑是否至少需要一个空格。+

  • (\s*)- 括号表示捕获组。您是否出于某种原因将空格捕获到组?如果没有,您可以直接删除括号,即仅使用.\s

根据评论进行更新

你好,问题不在于表达式,而在于不被视为空格的HTML输出。这是一个Joomla网站。

保留原始正则表达式,您可以使用:

wordA((?:\s| )*)wordB(?!(?:\s| )wordc)

唯一的区别是正则表达式不匹配空格 OR 。我用代替,因为这更明确。请注意,正如我已经指出的那样,当wordB后面跟着一个空格和wordc时,负面的展望将不匹配。如果您想匹配多个空格,请参阅上面的评论。我还保留了空格周围的捕获组,如果您不希望这样做,请删除括号,如上所述。 wordc\swordc?!

匹配示例:

enter image description here


答案 2

我之所以使用 a 而不是 '*',是因为加号被定义为前面的一个或多个元素,其中星号为零个或多个。在本例中,我们需要一个更具体的分隔符,即“一个或多个”空格。+

word[Aa]\s+word[Bb]\s+word[Cc]

将匹配:

wordA wordB     wordC
worda wordb wordc
wordA   wordb   wordC

在这个表达式中,单词必须是具体的,并且必须按顺序排列(a,b,然后c)


推荐