有一个 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十六进制字符代码:0x200cHTML 字符参考:‌Java 字符串:\u200c解决方案:如果我将波斯语(波斯语)键盘添加到 Windows 并将键盘语言更改为波斯语(波斯语),那么如果我使用 SHIFT+SPACE 在两个最新的括号 ]] 之间添加半个空格,效果很好!:{$title|regex_replace:'/[^[:punct:][:alnum:][:space:]]/u':''}(使用波斯语键盘的最新两个括号之间有一个半空格字符)但不幸的是,它不能使用十六进制代码\x200c,我不知道为什么!?
2 回答
慕虎7371278
TA贡献1802条经验 获得超4个赞
标准 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 的正则表达式表示赞赏)
人到中年有点甜
TA贡献1895条经验 获得超7个赞
在应用实际的正则表达式之前,您可以将任何分隔符 ( \p{Z}
) 替换为标准的完整空格。在这里按顺序进行:
preg_replace(['/(\p{Z})/', '[^[:punct:][:alnum:][:space:]]/u'], [' ', ''], $title)
- 2 回答
- 0 关注
- 100 浏览
添加回答
举报
0/150
提交
取消