半空间、半空间或零空间的正则表达式 POSIX 表达式

有一个 POSIX 括号表达式列表,如[:alnum:][:alpha:]...

https://www.regular-expressions.info/posixbrackets.html

哪一个是半空间或半空间或零空间?

EDIT1:实际上,我regex_replace在 smarty 代码中使用 PHP,如下所示

{$title|regex_replace:'/[^[:punct:][:alnum:][:space:]]/u':''}

此代码用空值替换所有字符,除了标点符号、字母数字和空格。

但不幸的是,它也用空字符串替换了半个空格。

例如:unicode persian string $title = '☺This is a test'

将更改为“这是一个测试”。

但正确的字符串应该是 'This is a test'

如您所见,它还将“این‌یک”中的半个空格替换为空值并将其转换为“اینیک”

我想阻止它。

EDIT2:半空间或零空间是:

十进制字符代码:8204

十六进制字符代码:0x200c

HTML 字符参考:‌

Java 字符串:\u200c

解决方案:如果我将波斯语(波斯语)键盘添加到 Windows 并将键盘语言更改为波斯语(波斯语),那么

如果我使用 SHIFT+SPACE 在两个最新的括号 ]] 之间添加半个空格,效果很好!:

{$title|regex_replace:'/[^[:punct:][:alnum:][:space:]‌]/u':''}

(使用波斯语键盘的最新两个括号之间有一个半空格字符)

但不幸的是,它不能使用十六进制代码\x200c,我不知道为什么!?


翻阅古今
浏览 106回答 2
2回答

慕虎7371278

标准 POSIX 字符类通常捕获字符类。如果您想匹配字符U+2002,那么只需完全匹配该字符,字面意思或使用您的编程语言支持的任何符号表示。Python:r = re.compile('\u2002')if r.match(somestring):    ...当然,您不需要正则表达式:if '\u2002' in somestring:    ...(我猜你的意思是 U+2002;还有许多其他空格,其中没有一个名称完全包含“半空格”。[:space:]当然,现代 POSIX 应该匹配所有空格。)更新:如果 PHP[:space:]不正确地 POSIX 和/或 Unicode 兼容,可能只需将代码点添加到您的表达式中。{$title|regex_replace:'/[^[:punct:][:alnum:][:space:]\x{2002}]/u':''}(对一系列 unicode 点 PHP 的正则表达式表示赞赏)

人到中年有点甜

在应用实际的正则表达式之前,您可以将任何分隔符 ( \p{Z}) 替换为标准的完整空格。在这里按顺序进行:preg_replace(['/(\p{Z})/', '[^[:punct:][:alnum:][:space:]]/u'], [' ', ''], $title)
打开App,查看更多内容
随时随地看视频慕课网APP