0

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

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

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

例如:

Request URI: /mysection/mykey/PageName.htm
Page Match:  /mysection/([^/]+)/pagename.htm

如果有人请求/mysection/mykey/PageName.htm,虽然这会起作用,但它不是正确的页面,在这种情况下正确的页面是/mysection/mykey/pagename.htm。

如果我最初进行不区分大小写的匹配,我可以找出链接到页面的人是否正确。如果他们没有,我们不会显示 404,我们要做的是在该部分中生成 rel="canonical" 以告诉 google 哪个页面是正确的并且这实际上是重复的。

该页面的正确 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 的地方,它应该是替换 ([^/]+) 的 $page['uri'] 版本与 $URI 的那部分包含的任何内容。

4

2 回答 2

0

它应该是一个三步程序:

  1. 从您的正则表达式中提取匹配项(此处mykey
  2. 获取正则表达式的修改版本,但将其视为简单字符串:/mysection/XXXXXXXXXX/pagename.htm
  3. 将 XXXXXXXXXX(或您想要的任何唯一标识符)替换为匹配项 mykey。

输出是/mysection/mykey/pagename.htm

于 2013-07-04T16:33:04.777 回答
0

i在区分大小写的正则表达式中 使用修饰符: http ://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

于 2013-07-04T16:17:36.773 回答