【问题标题】:PHP RegEx Excluding TWO strings from stringPHP RegEx从字符串中排除两个字符串
【发布时间】:2018-11-04 01:47:03
【问题描述】:

在搜索了各种其他问题以尝试自己解决这个问题后,我已经走到了这一步,但我不知道如何添加额外的字符串。

// $url will actually be $_SERVER['REQUEST_URI']
$url = "/folder123/?id=foo"; // it could be "index.php?id=foo"

preg_replace_callback('#^/folder123/#', function($match) {
    return $match[1];
}, $url);

预期结果: ?id=foo

使用我当前的代码,我会得到预期的结果;但是我不知道如何检查 index.php。我的意图是让字符串排除这两个部分。

【问题讨论】:

  • 没有上下文很难帮助你。为什么要排除 index.php 或 folder123?我认为访问$_GET 会更容易
  • 一定要使用‍‍RegEx吗?您还可以使用其他功能
  • 例如:$url = "/index.php/?id=foo"; echo substr($url , strpos($url, '?'))
  • @Mike 在某些地址中可能没有任何 GET 变量,因此不适合。不需要额外的上下文,因为我不是在寻找可能无法在所有情况下都有效的替代解决方案。
  • 测试一下:preg_replace_callback('/(\?|\&).*/', function($match) { var_dump($match[0]) ; }, $url);跨度>

标签: php trim regex-negation truncate


【解决方案1】:

要同时匹配它们,您可以使用alternation 后跟\K 来重置报告匹配的起点。

^(?:/folder123/|index\.php)\K.*$

preg_replace_callback('#^(?:/folder123/|index\.php)\K.*$#', function($match) { return $match[0]; }, $url);

Demo

【讨论】:

  • @theflarenet 这是另一个没有\K 的演示,但有一个将在回调中返回的捕获组。 Demo。现在preg_replace_callback 实际上返回匹配组的值?id=foo 我应该用那个更新我的答案吗?
  • 我不太确定,因为我看到了相同的最终结果,但也许你是对的——考虑到这个可能更合适,因为它是一对一的返回值。
【解决方案2】:

希望对你有帮助:

$url = "index.php?id=foo22"; // it could be "index.php?id=foo"

preg_replace_callback('/(\?|\&).*/', function($match) {
    var_dump($match[0]) ;
}, $url);

【讨论】:

  • 这行得通!但是,它需要一个 ^ 在正则表达式之前。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
相关资源
最近更新 更多