【问题标题】:Why this regex ignores the rest of matches?为什么这个正则表达式会忽略其余的匹配项?
【发布时间】:2014-06-06 22:28:43
【问题描述】:

我想匹配所有出现的 pony 单词,但以下情况除外:

  • [url=pony.com]pony[/url]
  • [url]小马.com[/url]

在综合中,匹配项应该是:

pony en pony [url=pony.com]pony[/url], también tengo que pony [url=pony.com ]pony[url], y no olvidar a [url]pony.com[/url]

为了实现目标,我创建了这个正则表达式:

(?!\[url[^\]]*?\])(pony)(?![^\[]*?\[\/url\])

但是,出于某种原因,匹配项如下:

pony en pony [url=pony.com]pony[/url], también tengo que pony [url= pony.com]pony[url], y no olvidar a [url]pony.com[/url]

为什么会这样?我的想法首先是找到正确的出现,然后使用 php 替换它们。

【问题讨论】:

  • 如果要全部替换,请使用 preg_replace() 而不是在一个函数中找到它们并在另一个函数中替换它们
  • 要做到这一点,你必须匹配你想要避免的:/thatIdontwant|pony/
  • @MarkBaker,这样做我认为我需要一个正则表达式,在这一点上,这就是这个问题的原因
  • javascript 或 PHP - 它是什么?
  • @jfriend00,抱歉,已删除 Javascript 标记。

标签: php regex replace


【解决方案1】:

它符合以下条件,因为您缺少正斜杠。

pony en pony [url=pony.com]pony[/url], también tengo que pony [url= pony.com]pony[url], y no olvidar a [url]pony.com[/url]

                                                                   ^ missing '/'

添加斜线就可以了,见live demo

【讨论】:

  • 哈哈哈天哪!那个错字!非常感谢!
  • /I/love/forward/slash/my/favorite/technique ;) +1
  • 但是,第一个负向lookahead是没有用的,如果[url]标签包含另一个BBcode标签,模式就会失败。
猜你喜欢
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
相关资源
最近更新 更多