【问题标题】:using preg_match and preg_replace使用 preg_match 和 preg_replace
【发布时间】:2011-04-23 12:25:33
【问题描述】:

我有两个字符串,例如:

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() 来完成。

我该怎么做?

谢谢。

【问题讨论】:

  • 您能否澄清一下您的意思是字面意义上的“ht-tp”,还是您只是这样写以便不会创建链接?
  • 只是为了防止自动链接
  • @mohamed87,您可以将示例链接格式化为源代码(使用 0101010 工具栏按钮)。
  • 0101010 工具栏按钮是什么?我认为我的问题很清楚。 ht-tp 是 http 但为了防止在 stackoverflow 中自动链接。如果您阅读了我的问题,我是说我想删除页码,以便类别中的链接将变为没有页码。
  • @OP:您可能会考虑添加标签“正则表达式”。此外,作为建议,“http”原样就可以了。自动链接或将它们作为源代码编写将不会那么混乱。只是一个建议。此外,三行文字(第 12、13 和 14 行)足以作为描述。其余的都是多余的。这将使其他人更容易帮助您。谢谢。

标签: php url preg-replace preg-match


【解决方案1】:

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

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

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

'$1$2'

上面的替换语句本质上将第一个捕获组(第一组括号计算为http://localhost/)与“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多