Php 简单的preg_替换我可以';不明白

Php 简单的preg_替换我可以';不明白,php,regex,preg-replace,Php,Regex,Preg Replace,我需要一个简单的正则表达式,它将在preg_replace中工作,将给定的任何输入转换为以下规则: 1) 第一个字符必须是A-Z或A-Z 2) 如果有多个字符,则以下字符必须是A-Z、A-Z、0-9或空格 我需要删除任何不一致的字符,并返回结果字符串 我将其作为正则表达式字符串: /^[a-zA-Z][a-zA-Z0-9 ]*$/ 我有一点正则表达式的经验,所以我认为这应该是可行的,但当我尝试以下字符串时: 1Athsj294-djs 在这里: 它不工作,请帮忙。谢谢 我认为您的正则表达式

我需要一个简单的正则表达式,它将在preg_replace中工作,将给定的任何输入转换为以下规则:

1) 第一个字符必须是A-Z或A-Z

2) 如果有多个字符,则以下字符必须是A-Z、A-Z、0-9或空格

我需要删除任何不一致的字符,并返回结果字符串

我将其作为正则表达式字符串:

/^[a-zA-Z][a-zA-Z0-9 ]*$/
我有一点正则表达式的经验,所以我认为这应该是可行的,但当我尝试以下字符串时:

1Athsj294-djs
在这里:


它不工作,请帮忙。谢谢

我认为您的正则表达式看起来不错,只是您必须删除
^
$

应该如此

preg_match('/[a-zA-Z][a-zA-Z0-9 ]*/', $subject)           // this is for preg_match though
preg_replace('/[^a-zA-Z]*([a-zA-Z][a-zA-Z0-9]*)[^a-zA-Z0-9]*/', '$1', '1Athsj294-djs') // for preg_replace

例如,您可以捕获
preg_match('/^[a-zA-Z][a-zA-Z0-9]*/',$string,$matches)
,并且$matches[0]将包含您的匹配项。如果你真的想进行预替换,那就需要前瞻性

$result = preg_replace('/^[^a-z]*([a-z][a-z0-9 ]*).*$/si', '\1', $subject);
变化

1Athsj294-djs
进入

说明:

^            # Start of string
[^a-z]*      # Match (optionally) any characters except ASCII letters
(            # Match and capture...
 [a-z]       #  one ASCII letter
 [a-z0-9 ]*  #  zero or more ASCII letters/digits or spaces
)            # End of capturing group
.*           # Match the rest of the string
$            # Match the end of the string

/si
修饰符使正则表达式不区分大小写,并允许点匹配换行符。

请澄清您的要求。要从输入中提取连续子字符串还是非连续子字符串?示例输入的正确输出是什么?
1Athsj294 DJ
?是
Athsj294
还是
Athsj294djs
,还是别的什么?我更喜欢Athsj294djs,但这似乎不是一个选项?因此,Athsj294将使用第一个
preg\u replace
链接我接受的答案,并使用以下模式:
/[^a-Za-z0-9]/
这给了我想要的
Athsj294djs
结果,你可以捕获“DJ”,就像OP现在澄清的那样,通过捕获
(.*)
作为第二个匹配字符串,将其与
\1\2
一起放入结果中,然后进行第二次传递,在初始一致性字符之后清除不一致性字符:
$result=preg_replace('/[^a-z0-9]/','',$result)
^            # Start of string
[^a-z]*      # Match (optionally) any characters except ASCII letters
(            # Match and capture...
 [a-z]       #  one ASCII letter
 [a-z0-9 ]*  #  zero or more ASCII letters/digits or spaces
)            # End of capturing group
.*           # Match the rest of the string
$            # Match the end of the string