正则表达式匹配任何空格

时间:2014-02-23 20:53:50

标签: php regex

我想使用regex和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 ...

2 个答案:

答案 0 :(得分:12)

你的正则表达式应该“按原样”运行。假设它正在做你想要的。

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

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

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

enter image description here

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

  • (?! 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)

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

示例匹配:

enter image description here

答案 1 :(得分:1)

我使用+而不是'*'的原因是因为加号被定义为前一个元素中的一个或多个,其中星号为零或更多。在这种情况下,我们想要一个更具体的分隔符,所以“一个或多个”空格。

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

将匹配:

wordA wordB     wordC
worda wordb wordc
wordA   wordb   wordC

在此表达式中,单词必须是特定的,并且也按顺序排列(a,b,然后是c)

相关问题