我已经有了一些工作代码,但我需要有人帮助解释为什么它可以工作!
我使用PHP来替换字符串中的任何内容,如果它不是az,AZ,0-9,逗号,分号,下划线或连字符(最终应该代表单个用户名或逗号) /分号分隔的用户名列表。)
以下作品:
$data = preg_replace('/[^,;a-zA-Z0-9_-]/s', '', $data);
但以下情况并非如此:
$data = preg_replace('/[^a-zA-Z0-9_-,;]/s', '', $data);
为什么这只会在逗号和分号开头时才有效?把它们放在最后似乎打破了事情(这是我最初尝试时遇到的事情/ [^ a-zA-Z0-9 _-] / s。
顺便说一句,我也使用以下内容修剪任何尾随分号(复数)或逗号(复数),有人可能会建议更有效和/或更优雅的方法来做这样:
if(preg_match('/;$/', $data))
{
$data = rtrim($data, ';' );
}
if(preg_match('/,$/', $data))
{
$data = rtrim($data, ',' );
}
感谢您的帮助:)
答案 0 :(得分:27)
这不是导致你问题的逗号和分号;这是连字符。查看角色类的部分并考虑它们的含义:
0-9 # Anything from '0' to '9', meaning 0, 1, 2, ... 9
A-Z # Anything from 'A' to 'Z', meaning A, B, C, ... Z
_-, # Anything from '_' to ',', meaning...uh...hmmm.
从_
到,
没有明确的进展,因此正则表达式引擎不确定该怎么做。在字符类中,如果要按字面解释连字符,则需要在类的开头或结尾处(或使用反斜杠进行转义)。所以这些都可行:
[^,;a-zA-Z0-9_-]
[^-,;a-zA-Z0-9_]
[^a-zA-Z0-9_\-,;]
至于修剪结束,你可以在一个正则表达式替换中完成所有这些:
$data = preg_replace('/[^,;a-zA-Z0-9_-]|[,;]$/s', '', $data);
答案 1 :(得分:2)
我认为重要的连字符的位置 - 必须在开头或结尾处是连字符(字面值),否则它用于定义范围。
答案 2 :(得分:1)
您可以将连字符转义并将其放在正则表达式中的任何位置,如\-
对于尾随的分号和逗号,试试这个/[,;]+$/
它应该匹配任何逗号和分号,即使它们很多。