使用preg_match解析网址 - regexp

时间:2017-11-23 12:13:56

标签: php regex preg-match

我正在尝试创建自己的路由类 - 我解析有效的网址时遇到了热门问题。

这是一个示例网址: http://localhost/app/module/command/i15

我需要在slash之后的每个元素成为使用php中的preg_match创建数组的附加元素。

所以 - 搜索我得到的数字:([0-9] +) 搜索包含字母的字符串,符号 - 或_我有([^。] +)(这是问题)

整个正则表达式如下:

(app)\/(module)\/([^.]+)\/i([0-9]+)

我想要一个包含5个元素的数组,类似于:

0 => app, 1=> module, 2 => command, 3 => i15

如果preg_match只会返回类似的东西,那将会更美:

0 => app, 1=> module, 2 => command, 3 => 15(没有我作为参数标识符)

任何人都可以快速帮助我吗?我坚持了2天,找不到合适的解决方案。

编辑: 我有一些预定义的正则表达式:

/app/contacts/list => (app)\/(contacts)\/([^.]+)
/app/contacts/edit/i15 => (app)\/(contacts)\/([^.]+)\/i([\d]+)
/app/contacts/view/i15-c2 => (app)\/(contacts)\/([^.]+)\/i([\d]+)-c([\d]+)

对于所有这些我准备不同的正则表达式如上所述。当我需要解析之间的问题时问题明星:

/app/contacts/preview/random-name/i15-c2 

/app/contacts/preview/random-name-i15-c2

([^。] +)也捕获\(斜杠) - 并且在上面的第一个例子中,这个斜线打破了整个正则表达式: - (

编辑第二次: - )

我为某些路径准备了一些预定义的regexp。让我们来看看:

$regexp = [
    [0 => '(app)\/([^/]+)'],
    [1 => '(app)\/([^/]+)\/i([0-9]+)']
];

接下来我检查当前网址并匹配最佳结果 - 我知道我想要什么,但php不知道用户选择了什么:

如果我输入带路径的网址:

应用程序/用户名/ I15

系统向我显示$ regexp [0]是最好的结果 - 它不是真的,因为$ regexp [1]是最好的。

我希望这能解释我的问题。

2 个答案:

答案 0 :(得分:0)

由于您正在使用组捕获正则表达式,因此可以使用它们来创建所需的数组。将变量传递给Process root = Runtime.getRuntime().exec("su"); txPrint1.append("\n \n root GRANTED \n \n"); 以存储组:

array_push($arra,{"letter":substr($key,3),"frequency":$value});

现在array_push($arra,array("letter"=>substr($key,3),"frequency"$value)); 的第一个元素是整个匹配,然后是组。

preg_match()

答案 1 :(得分:0)

好的继承我的路由类: https://gist.github.com/djmassive/d7487cef92e3adb1abf7ca31d3e96a53

整个魔法在方法解析()

中完成

我添加了路线:

$route->get('(app)\/:string', [ 'schema' => '2', 'module' => 'system', 'file' => 'profile' ]);
$route->get('(app)\/:string\/i:id', [ 'schema' => '2,3', 'module' => 'system', 'file' => 'profile', 'command' => 'view' ]);
  • 架构定义了我想要的内容 - 它可以是int,string或array。
  • 模块是文件夹名称
  • 文件是文件名
  • 命令是文件中的命令用于直接显示我想要的内容

如果我有网址: app / list - 系统读取它: $ command是list(schema显示第二个元素) - works

应用程序/用户名/ I15 应该查看$命令 $ id应为[username,15]

在这种情况下,第一个regexp显示66%的匹配,如第二个 - 但第二个应该是100%

看看debuging:

Checking regexp: #(app)\/([^/]+)# - to match path: app/username/i15
Results preg_match \$matches array:
Array ( [0] => app/username [1] => app [2] => username )
Percentage match: 66.6666666667%

Checking regexp: #(app)\/([^/]+)\/i([\d]+)# - to match path: app/username/i15
Results preg_match \$matches array:
Array ( [0] => app/username/i15 [1] => app [2] => username [3] => 15 )
Percentage match: 66.6666666667%

我们看到,第一个正则表达式并不好,因为没有第三个元素。

据我所知,整个问题主要是不返回不满足的条件。