使用preg_match和preg_replace

时间:2010-10-10 17:46:27

标签: php url preg-replace preg-match

我有两个字符串,如:

http://localhost/web/

http://localhost/web/category/

有时会变成:

http://localhost/web/2/http://localhost/web/3/等......

http://localhost/web/category/2/http://localhost/web/category/3/等......

我想进行验证并且:

如果链接为http://localhost/web/,则保持不变。

如果链接为http://localhost/web/2/,则会变为http://localhost/web/

如果链接为http://localhost/web/category/,则保持不变。

如果链接为http://localhost/web/category/2/,则会变为http://localhost/web/category/

我想应该使用preg_replace()preg_match()来完成。

我该怎么做?

感谢。

1 个答案:

答案 0 :(得分:2)

以下是您需要的正则表达式:

(http:\/\/localhost\/)(web|web\/category)\/([\d]+)\/

对于preg_replace函数,您将需要一个替换语句,它将根据您的条件重写字符串:

'$1$2'

上述替换语句基本上将第一个捕获组(第一组评估为http://localhost/的parens)与第二个捕获组“web”或“web / category”连接起来。由于我们不关心最后一个捕获组($ 3),因此我们不会将其添加到替换语句中;但是,我们可以抓住它。如果您不想捕获它,请将此“([\ d] +)”替换为“[\ d] +”。

以下是将模式与替换相结合以形成完整preg_replace语句的示例代码:

<?php

$pattern = '@(http:\/\/localhost\/)(web|web\/category)\/([\d]+)\/@i';

$subjects = array(
    'http://localhost/web/2/',
    'http://localhost/web/category/2/'
);

foreach ($subjects as $subject) {
    echo sprintf('Original: %s, Modified: %s', $subject, preg_replace($pattern, '$1$2', $subject)), PHP_EOL;
}

将上述代码放入文件(例如:replace.php)并通过命令行运行:

php replace.php