小于号和大于号内的正则表达式跳过句点

Regex skipping periods inside of less than sign and greater than sign

$regLinks = "~meaning+?.{0,500}\.~siU";

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

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

^---因此,与其停在<blue green.>,不如停在

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

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

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

<> 只是匹配自己。

[^>]* 匹配 0 个或多个非 > 字符。

实际上我们不匹配 "any character" (.),而是匹配

  • 一个 "normal" 字符(不是 < 的东西)

  • 一个<...>组(包含一个<,后跟0个或多个非>字符,再后跟>

试试这个:

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

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

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

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