【问题标题】:regex match any whitespace正则表达式匹配任何空格
【发布时间】:2014-03-25 07:48:45
【问题描述】:

我想使用 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 相同 wordA(1 个空格) wordB -> wordA wordb wordc ...

【问题讨论】:

  • \s* 适用于零个或多个空格。另外,捕获中有空格和wordc 是否有内在原因?
  • 感谢您的回复。抱歉,我没听懂你的问题。
  • (\s*)(?! wordc) 都是捕获,我问他们捕获有什么原因
  • @mrres1 (?!) 未捕获。
  • @mrres1 regular-expressions.info/lookaround.html。 '前瞻本身不是捕获组'。你可以试试看。

标签: php regex


【解决方案1】:

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

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)

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

示例匹配:

【讨论】:

  • 您好,问题不在于表达式,而在于 HTML 输出  不被视为空白。这是一个 Joomla 网站。任何想法。谢谢你的帮助。
  • @user3344311 - 查看我的更新,我会尽快添加一些示例。
【解决方案2】:

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

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

将匹配:

wordA wordB     wordC
worda wordb wordc
wordA   wordb   wordC

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

【讨论】:

  • 管道在字符类中没有特殊含义,它是一个文字字符。一个字符类只是一组字符。写[A|a][|aA][aA|] 完全相同。您可以将其替换为 [aA] 或者,为什么不替换为 (?:a|A)
  • 感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 2010-10-08
相关资源
最近更新 更多