【问题标题】:get middle of a string - remove left and right获取字符串的中间 - 删除左右
【发布时间】:2012-09-02 16:17:41
【问题描述】:

我有这个字符串:

"cursor:pointer; background:url(http://maps.google.com/staticmap?center=38.7376583333,-9.1658583333&maptype=satellite&zoom=14&size=300x300&key=ABQIAAAAvQ9c8pqKsi8K2dzb7UM9MhS13VDmd70a9rmDETSCgg2iXt3XnhQSnX4vFKfWO-3vdWNV5HHBnSLWLQ&sensor=true&hl=pt) no-repeat"

我想删除纬度和经度。所以我想把字符串的左边剪掉,直到"center=",然后从"&maptype="开始。

所以我已经剪掉了左边的部分,但现在我不知道如何剪掉右边的部分。

编辑:

$h1['style']=$html->find('td.sendGps',0)->style;

$string=$h1['style'];  // i have this, which does not work like the $string=""cursor:pointer; background:url(http://maps.google.com/staticmap?center=38.7376583333,-9.1658583333&maptype=satellite&zoom=14&size=300x300&key=ABQIAAAAvQ9c8pqKsi8K2dzb7UM9MhS13VDmd70a9rmDETSCgg2iXt3XnhQSnX4vFKfWO-3vdWNV5HHBnSLWLQ&sensor=true&hl=pt) no-repeat""
$inicio = "?center=";
$fim = "&maptype=";

$b = substr($string, strpos($string, $inicio) + 8);

【问题讨论】:

  • 用正则表达式不是更好吗?
  • 查看strrpos()。它与strpos() 相同,但从字符串末尾开始搜索。
  • 我把双引号留在了那里,但我认为您实际上并没有处理那些,对吧?
  • 命题乔,你怎么了?

标签: php string


【解决方案1】:

substr 接受三个参数,最后一个是返回字符串的长度(从起始位置开始)。

所以在你的情况下,你会使用$b = substr($string, strpos($string, $inico) + 8, 27);

但是,如果您要像这样操作字符串,则可能需要(在 URL 样式更改时不那么麻烦)使用 parse_urlexplode 来提取参数。

这是一个例子:

$originalString = "cursor:pointer; background:url(http://maps.google.com/staticmap?center=38.7376583333,-9.1658583333&maptype=satellite&zoom=14&size=300x300&key=ABQIAAAAvQ9c8pqKsi8K2dzb7UM9MhS13VDmd70a9rmDETSCgg2iXt3XnhQSnX4vFKfWO-3vdWNV5HHBnSLWLQ&sensor=true&hl=pt) no-repeat";

$url = substr($originalString, strpos($originalString, "url(") + 4);
$url = substr($url, 0, strrpos($url, ")"));

$params = parse_url($url, PHP_URL_QUERY);
$paramArray = explode("&", $params);

$paramArray 现在包含 URL 的 GET 参数的名称-值-对。

【讨论】:

  • 但 LAT 和 LON 的长度并不总是相同。
  • 我需要&maptype的strpost
【解决方案2】:
$str = "cursor:pointer; background:url(http://maps.google.com/staticmap?center=38.7376583333,-9.1658583333&maptype=satellite&zoom=14&size=300x300&key=ABQIAAAAvQ9c8pqKsi8K2dzb7UM9MhS13VDmd70a9rmDETSCgg2iXt3XnhQSnX4vFKfWO-3vdWNV5HHBnSLWLQ&sensor=true&hl=pt) no-repeat";
$str = explode('center=', $str);
$str = explode('&maptype=', $str[1]);
$str = $str[0];
echo $str;

小提琴: http://www.phpfiddle.org/main/code/6rs-5hh

另外,如果您想在之后分别获取 LAT 和 LONG,请在将它们分配给 $str 后使用此代码:

$str = explode(',', $str);
$lat = $str[0];
$long = $str[1];
echo 'Lattitude ' . $lat . ' and Longtitude ' . $long;

【讨论】:

  • 如果我在 $str 中定义像你一样的字符串,它会起作用,但我得到的字符串是:$h1['style']=$html->find('td.sendGps',0) ->风格;然后我做了 $str = $h1['style'] 并且不起作用。它说“注意...数组到字符串的转换”但是 echo $str 和 echo $h1['style'] 具有相同的结果。
  • 您应该先尝试var_dump($str);,然后再尝试使用它来查看您使用的是字符串还是数组。您不能使用上面的代码分解数组。您必须先将字符串放入其中。
  • pastebin.com/c1aCjcvJ 仍然不起作用。这是一个数组的问题
  • 结果:字符串(281) “光标:指针;背景:网址(maps.google.com/…)不重复” 38.7376583333,-9.1658583333&地图类型=卫星&放大= 14&尺寸= 300×&键= ABQIAAAAvQ9c8pqKsi8K2dzb7UM9MhS13VDmd70a9rmDETSCgg2iXt3XnhQSnX4vFKfWO-3vdWNV5HHBnSLWLQ&传感器=真HL = pt) 不重复
  • 当您执行var_dump($h1['style']); 时,会发生什么?
【解决方案3】:

这可能比你想经历的要多,但可以从 URL 中提取和分解 URL 和查询字符串:

<?php

$data = "cursor:pointer; background:url(http://maps.google.com/staticmap?center=38.7376583333,-9.1658583333&maptype=satellite&zoom=14&size=300x300&key=ABQIAAAAvQ9c8pqKsi8K2dzb7UM9MhS13VDmd70a9rmDETSCgg2iXt3XnhQSnX4vFKfWO-3vdWNV5HHBnSLWLQ&sensor=true&hl=pt) no-repeat";

$url = substr($data, strpos($data, 'url(') + 4);
$url = parse_url(substr($url, 0, strpos($url, ') ')));

print_r($url);

$query = explode('&', $url['query']);
$querypairs = array();

for ($i = 0, $l = count($query); $i < $l; $i++) {
    $pair = explode('=', $query[$i]);
    $querypairs[$pair[0]] = $pair[1];
}

print_r($querypairs);

?>

http://codepad.org/xRZ3zEcU

现在,如果您真的想这样做,以便可以重新组合成 CSS 定义以供以后使用,您可以将其反转,但我可能会尝试以类似的方式分解 CSS。或者,作为一种较小的手段,只需在先前的定义上执行 str_replace() 并在用 http_build_query() 重建结果 URL 后替换 $url

如果你真的,真的只是不关心它的其余部分......

<?php

$data = "cursor:pointer; background:url(http://maps.google.com/staticmap?center=38.7376583333,-9.1658583333&maptype=satellite&zoom=14&size=300x300&key=ABQIAAAAvQ9c8pqKsi8K2dzb7UM9MhS13VDmd70a9rmDETSCgg2iXt3XnhQSnX4vFKfWO-3vdWNV5HHBnSLWLQ&sensor=true&hl=pt) no-repeat";

$center = substr($data, strpos($data, '?center=') + 8);
$center = substr($center, 0, strpos($center, '&'));

print_r($center);

?>

http://codepad.org/RiJHTX6p

编辑:那些最后一分钟的更新总是让你...修复。

在单独的行的开始/结束处进行substr() 匹配,因此第二个strpos() 是相对于第一个匹配的结果。我认为这样做的方式更容易理解,并且性能(我相信)应该不会有显着差异。此外,它将处理查询字符串对的不同顺序,因为第二个“相关”&amp; 检查位于键之后。否则,我相信你最好分解查询字符串。

如果您想要 VB 和 VBA 中的 mid() 函数,您可以使用:

<?php

function mid($start, $end, $str) {
    $str = substr($str, strpos($str, $start) + strlen($start));
    return substr($str, 0, strpos($str, $end));
}

$data = "cursor:pointer; background:url(http://maps.google.com/staticmap?center=38.7376583333,-9.1658583333&maptype=satellite&zoom=14&size=300x300&key=ABQIAAAAvQ9c8pqKsi8K2dzb7UM9MhS13VDmd70a9rmDETSCgg2iXt3XnhQSnX4vFKfWO-3vdWNV5HHBnSLWLQ&sensor=true&hl=pt) no-repeat";

print_r(mid('?center=', '&', $data));

?>

http://codepad.org/2rjmC4PL

【讨论】:

  • +1 用于 parse_str 而不是其他人建议的乏味的爆炸内容。
  • 感谢 Jared Farrish。那行得通。你为什么这么说我的双引号?
  • @PropositionJoe - 我只是在验证双引号不是您需要处理的字符串的一部分。如果是这样,我要做的第一件事就是将它们从字符串中删除。如果没有,我不会担心。
【解决方案4】:

substr()

echo substr($s, 0, strpos($s, '?') + 1) . substr($s, strpos($s, '&') + 1);

preg_replace()

echo preg_replace('~(\?center=.+?&)~', '?', $string);

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 2019-09-12
    • 2017-10-20
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多