我有这种模式..匹配不能跨越多行(匹配中不能有任何换行符)所以我添加了m
修饰符..
但有时匹配中有\n
..如何防止这种情况?
preg_match_all('/(?<!\d|\d\D)(?:dk)?([\d\PL]{8,})/m', $input, $matches, PREG_PATTERN_ORDER);
答案 0 :(得分:0)
\PL
模式匹配任何char但是Unicode字母,并且还匹配数字和空白字符。因此,[\d\PL]
可以缩短为\PL
,因为您需要从中减去换行符,将其替换为反向速记字符类(\pL
)并在否定括号表达式中使用它,[^\pL]
,并在其中添加\r
和\n
:
'/(?<!\d|\d\D)(?:dk)?([^\pL\r\n]{8,})/u'
m
修饰符是多余的,因为它只重新定义了^
和$
锚点的行为。您可能需要u
修饰符,因为Unicode属性类可以安全地使用PHP / PCRE中的Unicode字符串。如果您只想匹配ASCII数字,请将\d
更改为[0-9]
,将\D
更改为[^0-9]
。