【问题标题】:Trim PHP String with variable within it修剪带有变量的PHP字符串
【发布时间】:2015-02-09 01:51:51
【问题描述】:

我遇到了一个小问题,我再次寻求您的帮助,解决方案可能很明显/看着我,但我还没有解决我的问题。

我需要修剪一个恰好有一个变量的字符串。 (字符串实际上是一个 URL)

示例字符串/URL:

/portal/index.php?module=SerialDB&page=listing&returnmsg=3

&returnmsg=3 可以是从 0 到 100 的数字范围,在某些情况下还可以是文本。这是我需要修剪的变量,因为我希望将字符串/ URL 的其余部分存储到数据库中。以下是我寻求的结果;

/portal/index.php?module=SerialDB&page=listing

我尝试了以下代码,只是为了看看它是否适合我需要的功能,但不幸的是它更具体,除非得到完全匹配,否则不会修剪。

$str = "/portal/index.php?module=SerialDB&returnmsg=3";
echo $str . "<br>"; // Test to see full string
echo chop($str,"&returnmsg="); // Attempt to trim the string

如果有人能胜任协助的任务,我将不胜感激。与我的所有问题一样,我也想了解正在发生的事情,而不是仅仅将代码交给我,以便我将来可以自信地使用它。

再次感谢大家:)

【问题讨论】:

  • preg_replace (&returnmsg=*) 带空白
  • 这个参数是否总是最后一个(如果存在)?您的网址是否包含锚部分?
  • 你求的结果肯定不是'/portal/index.php?module=SerialDB&page=listing',不然为什么不用php的子串函数:echo substr($str, 0, 46);
  • 是的,参数在出现时总是最后一个,但是 URL 的其余部分(如 &page= 和 &module= 可能不同,以及额外或更少的参数)的长度可能会有很大差异

标签: php string trim


【解决方案1】:

一种不依赖于参数顺序的快速方法就是将各个部分拆开,挑选出你想要的,然后将它们重新组合在一起(你可以查看各种 PHP 函数以获取更多详细信息):

$urlParts = parse_url($url);
parse_str($urlParts['query'], $queryParts);
$returnMsg = $queryParts['returnmsg'];
unset($queryParts['returnmsg']);
$urlParts['query'] = http_build_query($queryParts);
$url = http_build_url($urlParts);

【讨论】:

  • 此代码为我生成了一个错误。 Hudixt 似乎已经纠正了它,但输出并不是我想要的,但是感谢您向我展示这些功能,它们将来对我非常有用。 =)
【解决方案2】:

简单。这个概念被称为slicing

$url = "/portal/index.php?module=SerialDB&page=listing&returnmsg=3";

$new_url = substr( $url, 0, strrpos( $url, '&') );

结果是:/portal/index.php?module=SerialDB&amp;page=listing

substr() 函数返回字符串的一部分。它需要三个参数。参数 #1 是您要从中提取的字符串,参数 #2 是您要从哪里开始,参数 #3 是切片的长度或要提取的字符数。

strrpos() 函数返回字符串中子字符串最后一次出现的位置/索引。示例:如果您有字符串“zazz”,则将返回最后一个 z 的位置。您可以将其视为“字符串反转位置”。该函数接受三个参数。我将只介绍两个,因为这是我在此示例中使用的数字。参数 #1 是您要搜索的字符串,参数 #2 是针或您要查找的内容,在您的情况下为 &amp;。正如我在本段开头提到的,它以整数的形式返回位置。在你的情况下,这个数字是 46。

所以strrpos() 作为substr() 中的第三个参数告诉它在哪里分割字符串。完成后,它会返回您要提取的片段。

如果您阅读 PHP 手册并查看将来可能对您有所帮助的可用函数,将会很有帮助。您可以通过多种方式组合这些功能来解决您的问题。

http://php.net/manual/en/funcref.php

【讨论】:

  • 你能解释一下它是如何实现只切掉字符串中最后一个 & 的吗?
  • 我认为是这样,我意识到它以某种方式接收了最后一次出现但不明白如何。感谢您的解释,您的帮助获得了支持。我很感激。
【解决方案3】:

如果returnmsg 始终是您网址中的最后一个参数(而不是第一个),并且您的网址不包含锚点,那么简而言之,参数始终位于末尾,您可以使用简单explode:

$url = explode('&returnmsg=', $url)[0];

(你用&amp;returnmsg= 分割字符串并保留第一部分)。

否则,如 cmets 中的建议,您可以使用正则表达式替换:

$url = preg_replace('~[?&]returnmsg=[^&#]*~', '', $url);

图案细节:

~            # pattern delimiter
[?&]         # a literal "?" or a literal "&"
returnmsg=
[^&#]*       # any characters except "&" or "#" zero or more times
~

(对于这两种方式,如果参数不存在,则url保持不变。)

【讨论】:

  • 使用这里提供的 preg_replace 函数非常适合给定的场景。非常感谢。
【解决方案4】:

我不知道它是在开始还是结束,所以如果它结束了,请使用下面的代码。

<?php
    $url="/portal/index.php?module=SerialDB&page=listing&returnmsg=3";
    $array= explode("&",$url);
    $new_url="";
    foreach($array as $p){
    if(strpos($p,"returnmsg")===false){
    $new_url .=$p."&";
    }
    }
    echo rtrim($new_url, "&");

上面的代码是爆炸数组 & 然后运行一个 foreach 循环来加入它们。 @Bobdye 的答案也是正确的,但是该代码中存在一些问题,这不是为我运行的。使用下面的代码

<?php
     $url="/portal/index.php?module=SerialDB&page=listing&returnmsg=3";
    $urlParts = parse_url($url);
    parse_str($urlParts['query'], $queryParts);
    $returnMsg = $queryParts['returnmsg'];
    unset($queryParts['returnmsg']);
    $urlParts['query'] = http_build_query($queryParts);
    $url = http_build_query($urlParts);
    var_dump($url);

希望对你有帮助

【讨论】:

  • 我赞成这个答案,因为你提供的第一个代码 sn-p 工作得很好,但是我想建议我选择 Casimir 的答案仅仅是因为在我的特定用途中,它能够提供用更少的代码以更快的速度运行我想要的输出(就像你的一样)。
  • @Tarquin 我知道Casmir给出的答案是最好的答案
猜你喜欢
  • 2020-08-19
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多