小于号和大于号内的正则表达式跳过句点
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";
但是,这可能会消耗任意多个字符。
$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";
但是,这可能会消耗任意多个字符。