我想使用正则表达式和 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 or more whitespace) wordB -> wordA wordb wordc same wordA(1 whitespace) wordB -> wordA wordb wordc ...
最佳答案
您的正则表达式应该“按原样”工作。假设它正在做你想做的事。
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
。
根据评论更新
block 引用>Hello the problem is not the expression but the HTML out put that are not considered as whitespace. it's a Joomla website.
保留您可以使用的原始正则表达式:
wordA((?:\s| )*)wordB(?!(?:\s| )wordc)
唯一的区别是正则表达式不匹配空格或
。我替换了wordc
与\swordc
因为这更明确。请注意,我已经指出了负向前瞻?!
当 wordB 后面跟着一个空格和 wordc 时,将不匹配。如果您想匹配多个空格,请参阅我上面的评论。我还保留了空白周围的捕获组,如果您不想要这样,请按照上面所述删除括号。匹配示例:
![]()
关于php - 正则表达式匹配任何空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21974376/