Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在字符串中找到正则表达式本身并替换它_Php_Regex - Fatal编程技术网

Php 在字符串中找到正则表达式本身并替换它

Php 在字符串中找到正则表达式本身并替换它,php,regex,Php,Regex,我遇到了这样一种情况:我需要用正则表达式找到的值替换字符串的一部分,但使用正则表达式作为最终结果的基础 警告:这是为了解决网站上更大的规范化问题 我们有一个自定义CMS,它将通过正则表达式响应URL: 例如: 如果有人请求/mysection/mykey/PageName.htm,尽管这会起作用,但它不是正确的页面,在本例中正确的页面是/mysection/mykey/PageName.htm 如果我一开始进行不区分大小写的匹配,我可以找出链接到页面的人是否正确。如果他们没有,我们不会显示404

我遇到了这样一种情况:我需要用正则表达式找到的值替换字符串的一部分,但使用正则表达式作为最终结果的基础

警告:这是为了解决网站上更大的规范化问题

我们有一个自定义CMS,它将通过正则表达式响应URL:

例如:

如果有人请求/mysection/mykey/PageName.htm,尽管这会起作用,但它不是正确的页面,在本例中正确的页面是/mysection/mykey/PageName.htm

如果我一开始进行不区分大小写的匹配,我可以找出链接到页面的人是否正确。如果他们没有,我们不会显示404,我们要做的是在部分中生成rel=“canonical”,告诉谷歌哪个页面是正确的,这实际上是一个副本

页面的正确URL应为:

/mysection/mykey/pagename.htm
因此,我需要做的是将请求URI中的“mykey”部分叠加到页面匹配字符串中,但将页面匹配字符串的版本作为其总和作为结果

我一直在寻找preg_replace,但由于可以有多个替换,因此不能为其提供所需的第二个参数

以下是我编写的一些代码,以了解我现在的处境:

// $page['uri'] is the regex to match
// $URL is the requested URL at the web server.

// NB: it is not important to worry about if we have found a valid or invalid URL
// at this stage as that has already been processed prior to this point.

if (preg_match("|". $page['uri'] ."|", $URL)) {
    // we get here if the URLs match correctly and case sensitively.
    echo "Matches" . PHP_EOL;
} else {
    // we get here if the URLs don't case sensitively match
    echo "Doesn't match" . PHP_EOL;
}

它位于“不匹配”部分,我遇到了问题,因为这是我必须构建rel=“canonical”url的地方,该url应该是$page['uri']版本,其中([^/]+)替换为$uri的任何部分。

在区分大小写的正则表达式中使用
i
修饰符:
这应该是一个三步程序:

  • 从正则表达式中提取匹配项(此处
    mykey
  • 使用修改后的正则表达式,但将其视为简单字符串:
    /mysection/xxxxxxxxx/pagename.htm
  • 用匹配的mykey替换XXXXXXXXX(或任何您想要的唯一标识符)

  • 输出为
    /mysection/mykey/pagename.htm

    反向引用。将部分匹配捕获到括号中,这样您就可以将它们作为变量来使用。我认为我在这里看不到全局。您可以通过连接
    /startpath/
    、变量和
    /in/something
    ,简单地创建一个新字符串,对吗?你不是在寻找
    preg_replace
    ?反向引用可能是合适的,但由于非技术人员正在构建得到响应的URL,我可以看到更大的问题正在悄然出现。我已经彻底重写了问题,以使问题更清楚。你应该为问题添加更多的示例。我已经想到了dda,因为动态环境,我需要弄清楚正则表达式在哪里,以创建简化版本。如果我在同一个URL中有多个正则表达式(这将发生),那么我可以简单地将它们更改为AAA、BBB、CCC等,但它们不会形成统一的模式,因此我需要发现正则表达式-几乎就像在较低级别点击PCRE库一样。
    // $page['uri'] is the regex to match
    // $URL is the requested URL at the web server.
    
    // NB: it is not important to worry about if we have found a valid or invalid URL
    // at this stage as that has already been processed prior to this point.
    
    if (preg_match("|". $page['uri'] ."|", $URL)) {
        // we get here if the URLs match correctly and case sensitively.
        echo "Matches" . PHP_EOL;
    } else {
        // we get here if the URLs don't case sensitively match
        echo "Doesn't match" . PHP_EOL;
    }