我想使用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 ...
答案 0 :(得分:12)
你的正则表达式应该“按原样”运行。假设它正在做你想要的。
wordA(\s*)wordB(?! wordc)
这意味着匹配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)
唯一的区别是正则表达式不匹配空格OR
。我将wordc
替换为\swordc
,因为这更明确。请注意,我已经指出,当wordB后跟一个空格和wordc时,否定前瞻?!
将不匹配。如果您想匹配多个空格,请参阅上面的评论。我还保留了空白周围的捕获组,如果你不想这样,那么删除括号,如上所述。
示例匹配:
答案 1 :(得分:1)
我使用+
而不是'*'的原因是因为加号被定义为前一个元素中的一个或多个,其中星号为零或更多。在这种情况下,我们想要一个更具体的分隔符,所以“一个或多个”空格。
word[Aa]\s+word[Bb]\s+word[Cc]
将匹配:
wordA wordB wordC
worda wordb wordc
wordA wordb wordC
在此表达式中,单词必须是特定的,并且也按顺序排列(a,b,然后是c)