当前位置: 首页 > 知识库问答 >
问题:

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

夔高寒
2023-03-14

我在一个多语言网站上工作,并已选择使用每种语言的自定义URL,例如:

/en/cities/paris/
/nl/steden/paris/

两者都指向城市控制员的指数方法。

在每个页面上都有一个切换语言的选项,它会在我的路由中查找以匹配控制器、视图和语言。

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

在我开始使用更复杂的正则表达式之前,一切都很好。

我有这些正则表达式,它们将匹配我所需的URL:

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

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

如果不是。。考虑到URL的不同,我该如何获得指向同一页面不同版本的链接。。最好使其尽可能可编程。

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

从字符串/URL到一组匹配的条件很容易在MVC中使用,但反过来。。不幸的是,没有那么多。

共有1个答案

东郭骁
2023-03-14

是的,这是可能的!对于这种情况,我编写了以下解决方案:

$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/

在线演示

我让它变得“灵活”,所以你可以给它添加更多的价值!

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

$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/region/nord

在线演示

说明:

$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
}, substr($regex, 1, -1)); // substr($regex, 1, -1) => Get ride of the delimiters
echo $result; // output o_o

注意:这只适用于PHP 5.3

 类似资料:
  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?

  • 我不熟悉Javascript和正则表达式,所以我一直在研究如何使路由匹配所有以

  • 主要内容:实例下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为: 字符 描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。 ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或

  • 问题内容: 当匹配某些字符(例如换行符)时,可以使用正则表达式“ \\ n”或仅使用“ \ n”。例如,以下将字符串拆分为行数组: 但是以下内容同样适用: 我的问题: 上面两个是 完全 一样地工作,还是有细微的差别?如果是后者,能否举个例子,说明您得到不同的结果? 还是仅在[可能/理论]表现上有所不同? 问题答案: 在当前情况下没有区别。通常的字符串转义序列是在单个反斜杠的帮助下形成的,然后有效的

  • 在 OpenResty 中,同时存在两套正则表达式规范:Lua 语言的规范和 ngx.re.* 的规范,即使您对 Lua 语言中的规范非常熟悉,我们仍不建议使用 Lua 中的正则表达式。一是因为 Lua 中正则表达式的性能并不如 ngx.re.* 中的正则表达式优秀;二是 Lua 中的正则表达式并不符合 POSIX 规范,而 ngx.re.* 中实现的是标准的 POSIX 规范,后者明显更具备通用

  • 一、概述 二、匹配单个字符 三、匹配一组字符 四、使用元字符 五、重复匹配 六、位置匹配 七、使用子表达式 八、回溯引用 九、前后查找 十、嵌入条件 参考资料 一、概述 正则表达式用于文本内容的查找和替换。 正则表达式内置于其它语言或者软件产品中,它本身不是一种语言或者软件。 正则表达式在线工具 二、匹配单个字符 . 可以用来匹配任何的单个字符,但是在绝大多数实现里面,不能匹配换行符; . 是元字