Php 正则表达式取代标点符号

Php 正则表达式取代标点符号,php,regex,Php,Regex,我已经尝试了几个小时,以使这个工作的效果,我需要的,但没有工作非常像它应该。我正在构建一个讨论板类型的东西,并通过在帖子文本中添加@username来标记其他用户 目前,我有以下代码,可以在标签从整个文本中取出后,删除任何不属于用户名的内容: $name= preg_replace("/[^A-Za-z0-9_]/",'',$name); 这很有效,因为它可以正确捕获名称,例如(@username)、@username:、@username、一些文本等(因此要删除、、:和)) 但是,当用户的用

我已经尝试了几个小时,以使这个工作的效果,我需要的,但没有工作非常像它应该。我正在构建一个讨论板类型的东西,并通过在帖子文本中添加
@username
来标记其他用户

目前,我有以下代码,可以在标签从整个文本中取出后,删除任何不属于用户名的内容:

$name= preg_replace("/[^A-Za-z0-9_]/",'',$name);
这很有效,因为它可以正确捕获名称,例如
(@username)
@username:
@username、一些文本等(因此要删除

但是,当用户的用户名中包含非ascii字符时,这不起作用。例如,如果它是
@üsername
,那么上面那行的结果将给出
sername
,这是没有用的

有没有办法使用preg_replace去除这些额外的标点符号,但保留任何非ascii字母


非常感谢您的帮助:)

要检测标点符号,您可以使用unicode属性
\p{p}

$name = preg_replace('/[\p{P} ]+/', '', $name);

要检测标点符号,可以使用unicode属性
\p{p}

$name = preg_replace('/[\p{P} ]+/', '', $name);
您可以进入的区域

或者反过来说。我提供的链接包含更多的示例。

您可以输入的区域


或者反过来说。我提供的链接包含更多示例。

echo preg_替换('/[:punct:]+/','''-')-您可以通过复制粘贴我提供的字符串来尝试。这是mdash,显然不是由
[:punct:]
处理的。谢谢anubhava!这比我想象的要容易得多:)@hashi,尽管这个答案是错误的,并且提供的regexp没有过滤所有标点符号(参见我之前的评论)?好吧,不管这对你是否合适,对我也一样。@anubhava:防守并没有真正的帮助。您的答案至少在两个方面是错误的:第一,黑名单从来都不可靠,第二,没有unicode支持。请修复它。伙计们,我使用了原始答案(在编辑之前),在对我以前的代码不起作用的所有情况进行测试后,它达到了预期目的。
echo preg_替换('/[:punct:]+/',''-')-您可以通过复制粘贴我提供的字符串来尝试。这是mdash,显然不是由
[:punct:]
处理的。谢谢anubhava!这比我想象的要容易得多:)@hashi,尽管这个答案是错误的,并且提供的regexp没有过滤所有标点符号(参见我之前的评论)?好吧,不管这对你是否合适,对我也一样。@anubhava:防守并没有真正的帮助。您的答案至少在两个方面是错误的:第一,黑名单从来都不可靠,第二,没有unicode支持。请修复它。伙计们,我使用了原始答案(在编辑之前),在对我以前的代码不起作用的所有情况进行测试后,它达到了预期目的。这个答案对我来说更好,因为白名单是一种首选方式(匹配您想要保留的内容,而不是您想要删除的内容)。这个答案对我来说更好,因为白名单是首选方式(匹配您想要保留的内容,而不是您想要删除的内容)。