Php regex-从列表中的字符串中获取不同的字符

Php regex-从列表中的字符串中获取不同的字符,php,regex,Php,Regex,我试图从列表中的字符串中获取不同的字符 目前,模式为/^[!~]{0,2}/gm,它匹配前两个字符,但是如果同一字符在字符串中出现两次,它将使用重复字符,而不是搜索列表中出现的另一个字符。如果~~~测试通过,匹配项应为~ 下面的代码似乎有效,但我更喜欢100%正则表达式解决方案 $pattern='/^[!~]{0,2}/'; $matches=[]; $operator='='; $value=$origValue; 预匹配($pattern,$origValue,$matches); $ma

我试图从列表中的字符串中获取不同的字符

目前,模式为
/^[!~]{0,2}/gm
,它匹配前两个字符,但是如果同一字符在字符串中出现两次,它将使用重复字符,而不是搜索列表中出现的另一个字符。如果
~~~测试
通过,匹配项应为
~

下面的代码似乎有效,但我更喜欢100%正则表达式解决方案

$pattern='/^[!~]{0,2}/';
$matches=[];
$operator='=';
$value=$origValue;
预匹配($pattern,$origValue,$matches);
$matches=数组过滤器($matches);
如果(计数($matches)>0){
$matchesValue=array\u shift($matches);
$matchArr=str_split($matchesValue);
$matchArr=数组\唯一($matchArr);
$matchesValue=内爆(“”,$matcherR);
...
}
更新:请参阅。我正在尝试选择一个
或字符串开头的
~
一次。如果同一个字符出现多次,则应忽略重复字符并移动到下一个字符。更多示例:

!test     -> !
!!test    -> !
!~test    -> !~
!~~test   -> !~
test!     -> no match
test~~~   -> no match
有什么建议吗

$tests = [
'!test',
'!!test',
'!~test',
'!~~test',
'test!',
'test',
'~!test',
'~~~test',
'!~!~!~test',
];

$pattern = '/^(!~?|~!?)/';
foreach ($tests as $test) {
//~     echo "$test \t=> ";
    if (preg_match($pattern, $test, $m)) {
        $res = $m[0];
    } else {
        $res = "No match";
    }
    printf("%10s => %s\n", $test, $res);
}
输出:

     !test => !
    !!test => !
    !~test => !~
   !~~test => !~
     test! => No match
      test => No match
    ~!test => ~!
   ~~~test => ~
!~!~!~test => !~

“然而,我更喜欢100%正则表达式解决方案”-我不确定到底是什么问题,也不确定您的描述或基本的“示例”确实很有帮助。@04FS:请查看更新后的问题,并提供更多示例-希望这有助于更好地解释我的问题。只要您将模式定位为主题的开头(
^
),您就不能期望它在任何情况下都“继续”超过前两个字符。//你在这里想要的不是一个单一的正则表达式本身的工作,而是从IMHO开始。抱歉,@04FS,我不太明白你的意思。你是说我想要实现的不是正则表达式的工作吗?如果是的话,你还有什么建议?现在是什么样子?提前谢谢。
~!测试
~~~测试
!~~测试