Querystring参数explode str_replace数组仅适用于1个分隔符

时间:2014-09-25 21:02:27

标签: php arrays string str-replace explode

我在查询字符串URL的get参数上使用了explode和str_replace。我的目标是按特定字符拆分字符串以获取我想要的字符串中的值。我有问题。它应该有效,但不是。

以下是我使用str_replace查询字符串和分隔符的两个链接示例。

http://computerhelpwanted.com/jobs/?occupation=analyst&position=data-analyst

如您所见,上面的URL参数是position,值是data-analyst。分隔符是短划线-

http://computerhelpwanted.com/jobs/?occupation=analyst&position=business+systems+analyst

并且上面的这个网址使用相同的参数position,而值是business + systems + analyst。分隔符是+符号。

我想从查询字符串中获取的值是分析师这个词。这是分隔符之后的最后一个词。

这是我的代码应该做的伎俩,但由于某种原因没有。

$last_wordPosition = str_replace(array('-', '+')," ", end(explode(" ",$position)));

如果分隔符是+符号,则它有效,但如果分隔符是-符号则失败。

任何人都知道为什么?

3 个答案:

答案 0 :(得分:1)

你的事情顺序错误:

$last_wordPosition = end(explode(" ", str_replace(array('-', '+'), " ", $position)));

您可能希望将其拆分,以便在未将变量传递给E_STRICT时不会出现end错误:

$words = explode(" ", str_replace(array('-', '+'), " ", $position));
echo end($words);

或类似的东西:

echo preg_replace('/[^+-]+(\+|-)/', '', $position);

答案 1 :(得分:0)

正如@MarkB建议您使用parse_urlparse_str,因为它更适合您的情况。

来自parse_url的文档:

  

此函数解析URL并返回一个关联数组,其中包含存在的URL的各种组件。

来自parse_str的文档:

  

解析str,好像它是通过URL传递的查询字符串,并在当前范围内设置变量。

所以这就是你想要做的事情:

$url1 = 'http://computerhelpwanted.com/jobs/?occupation=analyst&position=data-analyst';
$url2 = 'http://computerhelpwanted.com/jobs/?occupation=analyst&position=business+systems+analyst';


function mySplit($str)
{
    if (preg_match('/\-/', $str))
        $strSplited = split('-', $str);
    else
        $strSplited = split(' ', $str);
    return $strSplited;
}

parse_str(parse_url($url1)['query'], $output);
print_r($values = mySplit($output['position']));
parse_str(parse_url($url2)['query'], $output);
print_r($values = mySplit($output['position']));

<强>输出

Array
(
    [0] => data
    [1] => analyst
)
Array
(
    [0] => business
    [1] => systems
    [2] => analyst
)

你说你需要这些价值观的最后一个元素。因此,您可以找到有用的endreset

echo end($values);
reset($values);

答案 2 :(得分:0)

回答我自己的问题,以显示我最终是如何做到这一点的。似乎比接受的答案更多的代码,但由于我被建议使用parse_url和parse_str,但无法使其正常工作,我采取了不同的方式。

function convertUrlQuery($query) {
    $queryParts = explode('&', $query);

    $params = array();
    foreach ($queryParts as $param) {
        $item = explode('=', $param);
        $params[$item[0]] = $item[1];
    }

    return $params;
}

$arrayQuery = convertUrlQuery($_SERVER['QUERY_STRING']); // Returns - Array ( [occupation] => designer [position] => webmaster+or+website-designer )

$array_valueOccupation = $arrayQuery['occupation']; // Value of occupation parameter

$array_valuePosition = $arrayQuery['position']; // Value of position parameter

$split_valuePosition = explode(" ", str_replace(array('-', '+', ' or '), " ", $array_valuePosition)); // Splits the value of the position parameter into separate words using delimeters (- + or)
然后

访问数组的不同部分

print_r($arrayQuery); // prints the array

echo $array_valueOccupation; // echos the occupation parameters value

echo $array_valuePosition; // echos the position parameters value

print_r($split_valuePosition); // prints the array of the spitted position parameter

foreach ($split_valuePosition as $value) { // foreach outputs all the values in the split_valuePosition array
            echo $value.' ';
}

end($split_valuePosition); // gets the last value in the split_valuePosition array

implode(' ',$split_valuePosition); // puts the split_valuePosition back into a string with only spaces between each word

输出以下

arrayQuery = Array
(
    [occupation] => analyst
    [position] => data-analyst
)

array_valueOccupation = analyst

array_valuePosition = data-analyst

split_valuePosition = Array
(
    [0] => data
    [1] => analyst
)

foreach split_valuePosition =

- data
- analyst

end split_valuePosition = analyst

implode split_valuePosition = data analyst