PHP - 拆分字符串 [duplicate]

PHP - Split string [duplicate]

提问人:Michael 提问时间:4/26/2011 更新时间:4/26/2011 访问量:297

问:

我想把这个字符串分成“来源:网络”、“图片:1”等部分......在我的网站中使用它。 从“Lat:”和“Lon:”中,我只需要提取数字。

    <cap>
Source: Web | Pics: 1 | Frame: 2 | Date: 4-25-2011 | On: App | Lat: 51.2222 | Lon: 7.6555
</cap>

最好的方法是什么?我读过关于 explode() 的文章,但我没有让它工作。 干杯

PHP的

评论

0赞 Jürgen Thelen 4/26/2011
也许你应该澄清你的意思是字符串包含所有显示的文本,包括 <cap> 标签,还是只包含 <cap> 标签内的内部文本,因为有些会考虑这些标签,有些则没有。
4赞 Kevin Peno 4/26/2011
加油。使用您帖子的标题,我得到了您问题的大量答案。另外,回去接受一些以前的答案或停止问他们。

答:

0赞 Mike Thomsen 4/26/2011 #1
$pieces = explode(' | ','Source: Web...'); //Rest of string in there.
$items = array();
foreach ($pieces as $piece) {
    $parts = explode(': ', $piece);
    $items[$parts[0]] = $parts[1];
}
-1赞 Yada 4/26/2011 #2

你是对的。explode 是最好的功能。

评论

1赞 BraedenP 4/26/2011
这真的不是一个好的答案。从他的问题来看,他知道 explode(),但无法让它正常运行。如果你要建议他使用它,你应该提供一个例子,就像其他所有答案一样。;)
0赞 Michael 4/26/2011
谢谢你们提供的许多例子和信息。我真的很感激!
0赞 vicTROLLA 4/26/2011 #3
$string = "Source: Web | Pics: 1 | Frame: 2 | Date: 4-25-2011 | On: App | Lat: 51.2222 | Lon: 7.6555";
$pieces = explode("|", $string);
print_r($pieces);
0赞 Mike 4/26/2011 #4
$items = explode(' | ', "Source: Web | Pics: 1 | Frame: 2 | Date: 4-25-2011 | On: App | Lat: 51.2222 | Lon: 7.6555");

foreach ($items as $item) {
   $new_data = explode(': ', $item);
   $my_array[$new_data[0]] = $new_data[1];
}

print_r($my_array);
0赞 ANisus 4/26/2011 #5

试试这个。它将拆分它们并创建一个关联数组:

$string = 'Source: Web | Pics: 1 | Frame: 2 | Date: 4-25-2011 | On: App | Lat: 51.2222 | Lon: 7.6555';
$list = explode('|', $string);
$assoc = array();
foreach($list as $part) {
    list($key, $val) = explode(':', $part);
    $assoc[trim($key)] = trim($val);
}

print_r($assoc);
4赞 Dutchie432 4/26/2011 #6

这是我使用的一些代码(DEMOexplode)

<?php    
    $str = "Source: Web | Pics: 1 | Frame: 2 | Date: 4-25-2011 | On: App | Lat: 51.2222 | Lon: 7.6555";
    $arr = explode(" | ", $str);
    foreach ($arr as $item){
        $arr2 = explode(": ", $item);
        $finalArray[$arr2[0]]=$arr2[1];
    }
    print_r($finalArray);
?>

结果

Array
(
    [Source] => Web
    [Pics] => 1
    [Frame] => 2
    [Date] => 4-25-2011
    [On] => App
    [Lat] => 51.2222
    [Lon] => 7.6555
)

用法

echo $finalArray['Lon']; //yields '7.6555'
0赞 Femi 4/26/2011 #7
$val =<<<END
<cap>
    Source: Web | Pics: 1 | Frame: 2 | Date: 4-25-2011 | On: App | Lat: 51.2222 | Lon: 7.6555
</cap>
END;

$bits = split("[:|]", $val);
$lat = trim($bits[11]);
$lon = trim($bits[13]);

评论

0赞 Dutchie432 4/26/2011
这将为您提供一个混合了键值的数组。糟糕的形式。
0赞 Jürgen Thelen 4/26/2011
但是使用 Heredoc 语法的 +1 ^^
0赞 Dutchie432 4/26/2011
这对这个问题有什么贡献:)
0赞 Jürgen Thelen 4/26/2011
它可能会贡献 s/t,因为它是目前考虑 <cap> 标签的唯一答案。目前尚不清楚 OP 是否想要拆分包含或排他性 <cap> 标签。但我当然同意分裂部分不是,我会做的^^
1赞 Dutchie432 4/26/2011
我不需要运行代码,我可以确切地告诉(正如我之前所说)你最终会得到什么。谁想通过交替数值来检索它们的值?看来你正在为编码员做更多的工作。 这比除非你能记住每个数字代表什么要容易得多。再一次,我要重申,这绝不是一个可取的方法。$array['lon']$array[11]
1赞 Galen 4/26/2011 #8

这是一个荒谬的单行代码,可能永远不应该使用,但它没有使用循环(我讨厌循环)。我也喜欢练习我的 RE

$str = 'Source: Web | Pics: 1 | Frame: 2 | Date: 4-25-2011 | On: App | Lat: 51.2222 | Lon: 7.6555';
preg_match( sprintf( '~%s~', implode(array_map( function($val){ if ($val) return sprintf( '%1$s:\s(?P<%1$s>.*?)(?:(?:\s\|\s)|(?:$))', $val ); }, preg_split( '~:.*?(?:(?:\s\|\s)|(?:$))~', $str ) ) ) ), $str, $m );
print_r($m);

结果

Array
(
    [Source] => Web
    [Pics] => 1
    [Frame] => 2
    [Date] => 4-25-2011
    [On] => App
    [Lat] => 51.2222
    [Lon] => 7.6555
)

评论

0赞 mickmackusa 3/21/2022
神圣的卷积,蝙蝠侠!你真的会写或建议在专业应用程序中使用它吗?