如何根据字符串顺序获取匹配字符串的模式
How to get the pattern that matched a string based on the string order
假设我们有以下 array:
$regexList = ['/def/', '/ghi/', '/abc/'];
和下面的 字符串 :
$string = '
{{abc}}
{{def}}
{{ghi}}
';
思路是从上到下遍历字符串,依靠正则表达式列表,找到结果并用大写的内容替换为模式无论 regexList array 是什么顺序,都根据字符串顺序匹配出现。
所以,这就是我想要的输出:
- ABC 匹配:/abc/;
- DEF 匹配:/def/;
- GHI 匹配:/ghi/;
至少
- ABC 匹配模式:2;
- DEF 匹配:0;
- GHI 匹配:1;
这是我正在尝试的代码:
$regexList = ['/def/', '/ghi/', '/abc/'];
$string = '
abc
def
ghi
';
$string = preg_replace_callback($regexList, function($match){
return strtoupper($match[0]);
}, $string);
echo '<pre>';
var_dump($string);
这个输出只是:
string(15) "
ABC
DEF
GHI
"
如何获取与 $string 顺序(从上到下)中的这些字符串匹配的偏移量或模式?谢谢。
不要使用正则表达式数组,使用带有替代项和捕获组的单个正则表达式。然后可以看到哪个捕获组不为空
$regex = '/(def)|(ghi)|(abc)/';
$string = preg_replace_callback($regex, function($match) {
for ($i = 1; $i < count($match); $i++) {
if ($match[$i]) {
return strtoupper($match[$i]) . " was matched by pattern " . $i-1;
}
}
}, $string);
@Barmar 说得对,但我要稍微修改一下:
$order = [];
$string = preg_replace_callback('/(def)|(ghi)|(abc)/', function($match) use (&$order) {
end($match);
$order[key($match)] = current($match);
return strtoupper($match[0]);
}, $string);
print_r($order);
输出:
Array
(
[3] => abc
[1] => def
[2] => ghi
)
假设我们有以下 array:
$regexList = ['/def/', '/ghi/', '/abc/'];
和下面的 字符串 :
$string = '
{{abc}}
{{def}}
{{ghi}}
';
思路是从上到下遍历字符串,依靠正则表达式列表,找到结果并用大写的内容替换为模式无论 regexList array 是什么顺序,都根据字符串顺序匹配出现。
所以,这就是我想要的输出:
- ABC 匹配:/abc/;
- DEF 匹配:/def/;
- GHI 匹配:/ghi/;
至少
- ABC 匹配模式:2;
- DEF 匹配:0;
- GHI 匹配:1;
这是我正在尝试的代码:
$regexList = ['/def/', '/ghi/', '/abc/'];
$string = '
abc
def
ghi
';
$string = preg_replace_callback($regexList, function($match){
return strtoupper($match[0]);
}, $string);
echo '<pre>';
var_dump($string);
这个输出只是:
string(15) "
ABC
DEF
GHI
"
如何获取与 $string 顺序(从上到下)中的这些字符串匹配的偏移量或模式?谢谢。
不要使用正则表达式数组,使用带有替代项和捕获组的单个正则表达式。然后可以看到哪个捕获组不为空
$regex = '/(def)|(ghi)|(abc)/';
$string = preg_replace_callback($regex, function($match) {
for ($i = 1; $i < count($match); $i++) {
if ($match[$i]) {
return strtoupper($match[$i]) . " was matched by pattern " . $i-1;
}
}
}, $string);
@Barmar 说得对,但我要稍微修改一下:
$order = [];
$string = preg_replace_callback('/(def)|(ghi)|(abc)/', function($match) use (&$order) {
end($match);
$order[key($match)] = current($match);
return strtoupper($match[0]);
}, $string);
print_r($order);
输出:
Array
(
[3] => abc
[1] => def
[2] => ghi
)