Querystring参数explose str_replace数组仅适用于其中一个分隔符


Querystring parameter explode str_replace array works for only 1 of the delimiters

我在查询字符串URL的get参数上使用爆炸和str_replace。我的目标是按特定字符分割字符串,以获得我想要的字符串值。我有问题。它应该起作用,但不起作用。

下面是两个链接示例,其中包含我用于str_replace的查询字符串和分隔符。

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

正如您所看到的,上面的URL参数是位置,值是数据分析师。分隔符是短划线-

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

上述URL使用相同的参数CCD_ 2,取值为业务+系统+分析师。分隔符是+符号。

我试图从查询字符串中获得的值是单词analyser。它是分隔符后面的最后一个单词。

这是我的代码,它应该能完成任务,但由于某种原因没有。

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

如果分隔符是+符号,它会工作,但如果分隔符为-符号,它就会失败

有人知道为什么吗?

你的东西顺序不对:

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

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

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

或者类似于:

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

正如@MarkB建议的那样,您应该使用parse_url和parse_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
)

你说过你需要这些价值观的最后一个元素。因此,你可以找到结束和重置有用:

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

回答我自己的问题,展示我是如何做到这一点的。似乎比公认的答案要多得多的代码,但由于有人建议我使用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