我正在尝试从列表中的字符串中获取不同的字符。
当前,模式为/^[!~]{0,2}/gm
,它与前两个字符匹配,但是如果同一字符在字符串中出现两次,它将采用重复字符,而不是搜索列表中出现的另一个字符。如果通过了!!!~~~test
,则匹配项应为!~
。
下面的代码似乎可以运行,但是我更喜欢100%的正则表达式解决方案。
$pattern = '/^[!~]{0,2}/';
$matches = [];
$operator = '=';
$value = $origValue;
preg_match($pattern, $origValue, $matches);
$matches = array_filter($matches);
if (count($matches) > 0) {
$matchesValue = array_shift($matches);
$matchArr = str_split($matchesValue);
$matchArr = array_unique($matchArr);
$matchesValue = implode('', $matchArr);
...
}
更新:请参阅https://regex101.com/r/6lMtfJ/2。我试图在字符串的开头选择一次!
或~
。如果同一字符出现多次,则应忽略重复的字符并移至下一个字符。更多示例:
!test -> !
!!test -> !
!~test -> !~
!~~test -> !~
test! -> no match
test~~~ -> no match
有什么建议吗?
答案 0 :(得分:0)
$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 => !~