如何在 PHP 中对字符串进行切片?

Posted

技术标签:

【中文标题】如何在 PHP 中对字符串进行切片?【英文标题】:How to slice a string in PHP? 【发布时间】:2011-12-03 14:10:49 【问题描述】:

好的,所以我得到了这个字符串:

"MICROSOFT CORP CIK#: 0000789019 (see all company filings)"

我想切断"CORP" 位之后的所有内容。我将如何在 php 中执行此操作?我习惯了 Python,所以我不确定这是如何完成的。

说清楚,这是我想要的输出:

"MICROSOFT CORP"

我正在尝试:

$companyname = substr($companyname, 0, strpos($companyname, " CIK"));

我什么也没看到。

这是我的完整代码:

<?php
include 'simple_html_dom.php';
$html = file_get_html('http://www.sec.gov/cgi-bin/browse-edgar?company=&match=&CIK=MSFT&filenum=&State=&Country=&SIC=&owner=exclude&Find=Find+Companies&action=getcompany');
$companyname = $html->find('span[class=companyName]', 0);
$companyname = substr($companyname, 0, strpos($companyname, " CIK#")+5);
$bizadd = $html->find('div[class="mailer"]');
echo $companyname;
echo "<br />";
foreach ($bizadd as $value) 
    $addvals = $value->find('span[class="mailerAddress"]');
    echo "<br />";
    foreach ($addvals as $value) 
        echo $value;
        echo "<br />";
    

?>

【问题讨论】:

安德鲁,在您修改后查看我更新的答案。 【参考方案1】:

我来到这个页面寻找一个切片slice($start, $end) 方法,但只找到了特定于案例的解决方案。

就我而言,我只有索引(开始和结束)。需要length 来分割字符串似乎很愚蠢。所以我写了一个切片函数。它模仿了 javascript 的 slice 方法。

// str_slice(string $str, int $start [, int $end])
function str_slice() 
    $args = func_get_args();
    switch (count($args)) 
        case 1:
            return $args[0];
        case 2:
            $str        = $args[0];
            $str_length = strlen($str);
            $start      = $args[1];
            if ($start < 0) 
                if ($start >= - $str_length) 
                    $start = $str_length - abs($start);
                 else 
                    $start = 0;
                
            
            else if ($start >= $str_length) 
                $start = $str_length;
            
            $length = $str_length - $start;
            return substr($str, $start, $length);
        case 3:
            $str        = $args[0];
            $str_length = strlen($str);
            $start      = $args[1];
            $end        = $args[2];
            if ($start >= $str_length) 
                return "";
            
            if ($start < 0) 
                if ($start < - $str_length) 
                    $start = 0;
                 else 
                    $start = $str_length - abs($start);
                
            
            if ($end <= $start) 
                return "";
            
            if ($end > $str_length) 
                $end = $str_length;
            
            $length = $end - $start;
            return substr($str, $start, $length);
    
    return null;



var_dump( str_slice("abcdefghijklmnopqrstuvwxyz")          ); // "abcdefghijklmnopqrstuvwxyz"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", 5)       ); // "fghijklmnopqrstuvwxyz"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", -5)      ); // "vwxyz"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", 40)      ); // ""
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", -40)     ); // "abcdefghijklmnopqrstuvwxyz"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", 5, 10)   ); // "fghij"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", 5, 20)   ); // "fghijklmnopqrst"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", 5, 30)   ); // "fghijklmnopqrstuvwxyz"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", -20, 2)  ); // ""
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", -20, 10) ); // "ghij"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", -20, 15) ); // "ghijklmno"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", -20, 40) ); // "ghijklmnopqrstuvwxyz"

【讨论】:

感谢您的努力!这个问题已经超过 7 年了,当我问这个问题时,我就像 3 家公司一样!你应该把它变成一个可供人们使用的库 我有一个repository,用于转储我的脚本,它位于str_random.php。我没有时间管理/重组文件,所以目前我只是把它们转储在那里:)【参考方案2】:

您可以使用explode() (http://php.net/explode) 或substr() (http://php.net/substr) 与strpos() (http://php.net/strpos) 的组合。

<?php
$string = "MICROSOFT CORP CIK#: 0000789019 (see all company filings)";
$newString = substr($string, 0, strpos($string, " CIK#"));
echo $newString;

编辑:编辑了几次以适合您的问题编辑...

【讨论】:

呃,这似乎切断了 CORP 之前的一切! @AndrewAlexander:抱歉,问题不够清楚;也用第二个选项更新了答案。 $newString = substr($string, 0, strpos($string, "CIK#")+5);用 $companyname 代替 $newString 也不起作用。 Hrm,可能还有其他部分我看不到?我从页面的 HTML 中提取它。这可能是它不起作用的原因吗?您将 $string 设置为相关字符串的示例效果很好。但是我需要的正常的不工作 您必须展示一个 HTML 样本和您编写的未获取正确字符串的脚本;我建议先找一个关于 HTML 解析的答案,如果没有可以让你满意的问题,请打开一个新问题,因为这是一个全新的主题。祝你好运!【参考方案3】:

假设你的字符串存储在 $a 中,那么任何一个

echo substr($a, 0, strpos($a, " CIK"));

preg_match("/(.*) CIK/", $a, $matches);
echo $matches[1];

echo preg_replace("/(.*) CIK.*/", "$1", $a);

会的。

【讨论】:

$companyname = substr($companyname, 0, strpos($companyname, "CIK"));试了试,一无所获。 @Andrew Alexander:可能是一个简单的错误。您确定您的字符串内容是您指定的内容吗?如果是这样,您是否正确地回显了正确的输出? 据我所知 - 我将如何检查我的字符串是否包含 echo 未显示的更多信息?该字符串中有一个链接 - 我想这可能会导致问题? 我为我的普遍无知道歉,我是 PHP 切片的新手【参考方案4】:

你会用strpos找到"CORP"的位置(一定要阅读巨大的红色警告),然后用substr切断相关部分。

【讨论】:

以上是关于如何在 PHP 中对字符串进行切片?的主要内容,如果未能解决你的问题,请参考以下文章

如何在JavaScript / Jquery中对另一个数组中已经存在的数组元素进行切片[重复]

如何正确地在 PHP 中对字符串进行 URL 编码?

如何在 Javascript 中对对象进行切片?

如何在 Bash 中对数组进行切片

如何在 Excel VBA 中对数组进行切片?

如何在 TensorFlow 中对批次进行切片并在每个切片上应用操作