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,我不太明白你的意思。你是说我想要实现的不是正则表达式的工作吗?如果是的话,你还有什么建议?现在是什么样子?提前谢谢。~!测试
或~~~测试
或!~~测试
?