gpt4 book ai didi

php - 使用 PHP 存储在 ASTERISK 数据库中的规则的正则表达式

转载 作者:行者123 更新时间:2023-11-30 00:36:47 25 4
gpt4 key购买 nike

我正在尝试创建一种带有动态变量的正则表达式PHP 使用一些存储在数据库表中的预定义值,以便验证来自 Asterisk 的拨号字符串。数据库有传出规则表,每个用户可以创建该表以应用于他/她的分机。

PHP 中的变量可以是这样的:

$N = '[23456789]';
$Z = '\d*'; //(any digit, any occurrence)
$X = '[0-9]';
$x = '[0-9]';

规则中的数字将被视为数字本身

规则中的符号将被视为符号本身(数据库中仅接受 * 和 # 作为符号)

表格是这样的:

+----+-----------+-------+-------------+------------+----------+-----------+--------+--------+
| id | extension | order | description | ruledigits | ruletype | subtract | prefix | suffix |
+----+-----------+-------+-------------+------------+----------+-----------+--------+--------+
| 1 | 1005 | 1 | | 9XX | Block | null | null | null |
| 2 | 1005 | 2 | | 302NXXXXXX | Mod | null | 1 | null |
| 3 | 2005 | 1 | | 00Z | Mod | 2 | 011 | null |
+----+-----------+-------+-------------+------------+----------+-----------+--------+--------+

因此,如果 1005 分机调用 908(没有更多数字),则应阻止该调用根据操作字段。如果1005分机调用3025555555(没有更多数字),该调用将以数字 1 为前缀。

如果 1005 分机调用 00325698289115(国际),该调用将不会我根据规则 # 3 进行了修改,因为该规则仅适用于 EXT 2005,所以CALL 将按照调用到服务器时的方式发送。

如果最后一次调用是在 2005 年进行的,则该号码将符合规则,因为它以 00 开头,并且 Z 是任何出现的任何数字。所以,调用的号码会从开头减去“2”位,然后加上“011”前缀,然后发送到中继。

我认为这里重要的字段是ruledigits(当然还有扩展名),PHP 将使用它来表示每个 EXT 的规则数组。那么该 Action 将仅当满足条件时才读取。

条件是这样的,虽然这只是代表1 规则和案例:

if(preg_match("/^1$N$X$N(555)$Z/", $number))
{
// $number format matches
echo "yes"; // apply the action according the table
}
else
{
echo "no"; // no action applied, proceed with the call.
}

我需要的条件必须在实际情况发生后立即创建调用(通过php脚本请求访问数据库)发现不仅有 1 个规则,还有一些单独为该扩展创建的规则。

如何制作或设计一个可以访问数据库“规则”的通用函数表,并 ARRAY 在调用者下创建的所有条件的组扩展以便将它们应用到实际调用中?

注:字段表“ruledigits”中的“ruledigits”仅接受以下字符:
N、Z、*、# 或任何数字。

最佳答案

以下是我个人如何使用 MySQL 数据构建用于检查数据的正则表达式模式:

//Simplified array
$dbResults = array(
array(
'id' => 1,
'extension' => 1005,
'order' => 1,
'description' => 'rule 1',
'ruledigits' => '9XX',
'prefix' => null,
'ruletype' => 'Block'
),
array(
'id' => 2,
'extension' => 1005,
'order' => 2,
'description' => 'rule 2',
'ruledigits' => '302NXXXXXX',
'prefix' => 1,
'ruletype' => 'Mod'
),
array(
'id' => 3,
'extension' => 2005,
'order' => 3,
'description' => 'rule 3',
'ruledigits' => '00Z',
'prefix' => '001',
'ruletype' => 'Mod'
)
);
$regexParts = array(
'N' => '[2-9]'
,'Z' => '\d*'
,'X' => '\d'
,'x' => '\d'
);
//Static test vars
$userExt = 1005;
$dialTests = array('00325698289115','908','3025555555');
echo 'Testing user extension: '.$userExt;
echo '<br /><br />';
//This loop is for testing purposes only, the contents are all the live system would use
foreach($dialTests as $testNo)
{
$actionTaken = 'None';
//By default, if nothing happens, make sure the final number is the original one we saw
$finalNo = $testNo;
foreach($dbResults as $row)
{
if($userExt != $row['extension']) continue;//If it's not the right extension, skip the rest of this loop iteration's code and move on to the next row
$regex = '';
$tokens = str_split($row['ruledigits']);//Turn the string into an array, so we can parse each character individually
foreach($tokens as $token)
{
if(isset($regexParts[$token])) $regex .= $regexParts[$token];//If the letter has a special meaning, use that
else $regex .= $token;//else just throw that exact letter/number in
}
if(preg_match('#^'.$regex.'$#',$testNo)>0)
{
$actionTaken = $row['ruletype'];//Log what action has been taken
if($actionTaken=='Mod')
{
$finalNo = $row['prefix'].$testNo;//Do the mod action
}
else if($actionTaken=='Block')
{
$finalNo = false;//Nullify the final number, so we know to block the call later on
}
}
}
//Here we just dump some info for testing purposes
echo $testNo.': Action taken = '.$actionTaken;
if($actionTaken=='Block') echo ' - Call terminated.';
if($actionTaken=='Mod') echo ' - New number = '.$finalNo;
echo '<hr />';
}

查看输出演示 on phpfiddle (单击运行/F9)

关于php - 使用 PHP 存储在 ASTERISK 数据库中的规则的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22105442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com