在字符串中查找正则表达式并替换它

时间:2013-07-04 16:06:19

标签: php regex

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

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

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

例如:

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

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

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

页面的正确网址为:

/mysection/mykey/pagename.htm

所以,我需要做的是将“mykey”部分从Request URI叠加到Page Match字符串中,但将页面匹配字符串的版本作为结果的总和。

我一直在查看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 =“规范”的网址,这应该是带有([^ /]的$ page ['uri']版本+)替换为所包含的$ URI部分。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这应该是一个三步程序:

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