【问题标题】:Regex skipping periods inside of less than sign and greater than sign正则表达式在小于号和大于号内跳过句点
【发布时间】:2015-12-26 04:21:57
【问题描述】:
$regLinks = "~meaning+?.{0,500}\\.~siU";

我需要最后一个句号,\\. 不在小于号之内,而大于号 <> 之内。所以像<color blue.> 这样的东西会被跳过。我将如何在正则表达式中实现这一点?

$string "meaning: sad is when you are unhappy <blue green.> right now.";

^---因此,与其停在&lt;blue green.&gt;,不如停在

meaning: sad is when you are unhappy `<blue green.>` right now.

【问题讨论】:

  • 前瞻(附加到\.(?![^&gt;]*&gt;) 可以做到这一点。请说明您要达到的目标。
  • @stribizhev 我猜? :) 我让其中一个开始工作,并从字典网站中提取定义!
  • 是的,但是您在正则表达式中有meaning,在示例中有colorblue。那不是很清楚。顺便说一句,g+? 匹配 1 个或多个 g
  • 嗯,蓝色只是一个例子。
  • @stribizhev 我用更多示例更新了代码。

标签: php regex preg-match-all


【解决方案1】:

您可以将.{0,500} 中的. 更改为(?:[^&lt;]|&lt;[^&gt;]*&gt;)

(?: ) 是一个不捕获的正则表达式组(普通的( ) 也会捕获它匹配的字符串)。

&lt;&gt; 只是匹配它们自己。

[^&gt;]* 匹配 0 个或多个非&gt; 字符。

实际上,我们不匹配“任何字符”(.),而是匹配任一

  • “正常”字符(不是&lt;

  • 一个&lt;...&gt; 组(由一个&lt; 组成,后跟0 个或多个非&gt; 字符,后跟&gt;

【讨论】:

  • 很好的答案!我很感激! :)
  • 哦。顺便说一句,因为我也在尝试学习正则表达式,你能解释一下 ?: 是什么意思吗?我知道 [^] 表示不是 >。但是中间的 呢?那是什么意思?谢谢。
  • 多读几遍就明白了。感谢更新! :)
【解决方案2】:

试试这个:

$regLinks = "~meaning+?(?:[^<]|<[^>]*>){0,500}\\.~siU";

我保留了 {0,500} 位,因为我认为您有这样做的理由,尽管这样写会更有效率:

$regLinks = "~meaning+?(?:[^<]+|<[^>]*>){0,500}\\.~siU";

但是,这可能会消耗任意多个字符。

【讨论】:

  • 如果匹配在最后失败,效率会降低,因为现在你必须经历组合回溯。如果你想优化这种情况,你可以使用 Friedl 的“展开”技巧:[^&lt;]*(?:&lt;[^&gt;]*&gt;[^&lt;]*)*
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多