PHP爆炸,我自己的逻辑问题

时间:2013-07-04 17:25:25

标签: php

我需要用户提交有关在何处爆炸字符串的规则。

让我们说我们有一个字符串:

$str = "Age: 20 Town: London Country: UK";

让我们说用户想要字符串的“UK”部分,所以他输入

$input = "Country:";

在这种情况下:

$output = end(explode($input, $str));

$output would contain: "UK"

如果他想要“伦敦”,我该怎么做?

$str = "Age: 20 Town: London Country: UK";

$part = end(explode('Town:', $str));

$parts = explode('Country: UK', $part);

$parts[0]; -> London

但是基于爆炸的用户输入参数这样做的最佳方法是什么呢?我基本上想要给出从字符串中删除一些东西的选项,这必须基于可以为更多字符串重复的规则包含相同的基本子串,例如Country,Age等。

编辑1:

我不认为我很清楚,我的不好。

基本上用户输入应该以所需值的周围为目标:

$ str =“年龄:20城镇:伦敦国家:英国”;    $ userinput =“Town:{某些通配符,如#!#}国家/地区:”

我可以使用哪些函数/函数组合来捕获通配符并返回该位置的子字符串?

编辑2:我进行了实验并找到了解决方案

想要输出=哥本哈根

$string = "Age: 20 Town: Copenhagen Location: Denmark";

$input = "Town: #!# Location:";

$rules = explode('#!#', $input);

$part = explode($rules[0], $string);

$part = explode($rules[1], $part[1]);

echo $part[0]; ->Copenhagen

4 个答案:

答案 0 :(得分:1)

拯救的正则表达式:

$field = 'Town';
$re = preg_quote($field, '/');
$matches = array();
preg_match("/$re: ([^ ]*)/", 'Age: 20 Town: London Country: UK', $matches);
echo $matches[1];   # London 

鉴于两个字段,你可以得到它们之间的任何文字:

$matches = array();
preg_match("/Age: (.*) Country:/", 'Age: 20 Town: London Country: UK', $matches);
echo $matches[1];   # 20 Town: London 

答案 1 :(得分:0)

$search = preg_quote($input, '#');
preg_match("#$search: ([^:]+) #", $str, $matches);
echo $matches[1];

这甚至应该处理输入中的空格

答案 2 :(得分:0)

问题是你的字符串过度使用了空格,这使得解析值变得困难。如果可以使用其他字符来区分您的值而不是空格,那么您可以更轻松地使用它。

例如:

$str = 'Age:20,Town:New York,Country:US';
$pairs = explode(',', $str);
$arr = array();
foreach($pairs as $pair) {
    $tmp = explode(':', $pair);
    $arr[$tmp[0]] = $tmp[1];
}
print_r($arr);

输出:

Array
(
    [Age] => 20
    [Town] => New York
    [Country] => US
)

答案 3 :(得分:0)

你可以这样做:

$str = 'Age: 20 Town: London Country: UK';
$input = 'Town: #!# Country:';
$parts = explode(' ',$str);
$sides = explode(' #!# ',$input);
$left = $sides[0]; $right = $sides[1];
$length = count($parts);
$output = '';
for($i = 0 ; $i<$length ; $i++) {
    if($parts[$i] == $right) {
        for($j = $i+1 ; $j<$length ; $j++) {
            if($parts[$j]==$left) break;
            $output .= $parts[$j];
        }
    }
}

echo $output;

经过测试,工作。

输出:

UK