加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

反转正则表达式,从正则表达式创建字符串

发布时间:2020-12-14 06:31:51 所属栏目:百科 来源:网络整理
导读:我正在使用多语言网站,并选择使用每种语言的自定义网址,例如: /en/cities/paris//nl/steden/paris/ 两者都指向Cities控制器的Index方法. 在每个页面上都有一个切换语言的选项,它会查看我的路线以匹配控制器,视图和语言. 因此,如果我在荷兰语页面上,它会找到
我正在使用多语言网站,并选择使用每种语言的自定义网址,例如:
/en/cities/paris/
/nl/steden/paris/

两者都指向Cities控制器的Index方法.

在每个页面上都有一个切换语言的选项,它会查看我的路线以匹配控制器,视图和语言.

因此,如果我在荷兰语页面上,它会找到英文版的正确网址,这将是“城市”而不是“steden”.

一切正常,直到我开始使用更复杂的正则表达式.

我有这些正则表达式将匹配我想要的URL:

#^en/cities/([^/]+?)/$#
#^nl/steden/([^/]+?)/$#

在我的代码中,我可以访问匹配的变量,在此示例中为“paris”.是否可以“反转”这个正则表达式并打印’en / cities / paris /’

如果不是..考虑到URL是不同的,我将如何开始链接到同一页面的不同版本…最好将其尽可能地编程.

在一个有点类似的问题,有人回答(http://stackoverflow.com/a/7070734/616398)正则表达式的本质是匹配无数的结果..所以它可能是不可能的.

很容易从字符串/ URL转到一组匹配的标准,以便在MVC中使用,但另一种方式……不用说,不幸的是.

是的,这是可能的!对于这种情况,我编写了以下解决方案:
$regex = '#^en/cities/([^/]+?)/$#';
$replace = array('paris');

$result = preg_replace_callback('#^^|([^)]*)|$$#',function($m)use($replace){
    static $index = 0;
    if($m[0] === '^' || $m[0] === '$'){return '';}
    if(isset($replace[$index])){
        return $replace[$index++];
    }
    return $m[0];
},substr($regex,1,-1));
echo $result; // en/cities/paris/

Online demo

我已经使它“灵活”,所以你可以添加更多的值!

$regex = '#^en/cities/([^/]+?)/region/([^/]+?)$#'; // <<< changed
$replace = array('paris','nord'); // <<< changed

$result = preg_replace_callback('#^^|([^)]*)|$$#',-1));
echo $result; // en/cities/paris/region/nord

Online demo

说明:

$regex = '#^en/cities/([^/]+?)/region/([^/]+?)$#'; // Regex to "reverse"
$replace = array('paris','nord'); // Values to "inject"

/*  Regex explanation:
   #   Start delimiter
       ^^         Match "^" at the begin (we want to get ride of this)
       |           Or
       ([^)]*)   Match "(",anything zero or more times until ")" is found,")"
       |           Or
       $$        Match "$" at the end (we want to get ride of this)
   #   End delimiter
*/

$result = preg_replace_callback('#^^|([^)]*)|$$#',function($m)use($replace){
    static $index = 0; // Set index 0,note that this variable is only accessible in this (anonymous) function
    if($m[0] === '^' || $m[0] === '$'){return '';} // Get ride of ^/$at the begin and the end
    if(isset($replace[$index])){ // Always check if it exists,for example if there were not enough values in $replace,this will prevent an error ...
        return $replace[$index++]; // Return the injected value,at the same time increment $index by 1
    }
    return $m[0]; // In case there isn't enough values,this will return ([^/]+?) in this case,you may want to remove it to not include it in the output
},-1)); // substr($regex,-1) => Get ride of the delimiters
echo $result; // output o_o

Note: This works only on PHP 5.3+

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读