如何在PHP中切割字符串?

6

好的,我有一个字符串:

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

我想截取"CORP"后的所有内容,用PHP该如何实现?我习惯使用Python,对于PHP不太熟悉。

明确一下,这是我想要的输出:

"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 />";
    }
}
?>

安德鲁,请在您的编辑后检查我的更新答案。 - Dvir
4个回答

23

你可以使用 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之前的所有内容! - Steven Matthews
@AndrewAlexander:抱歉,问题表述不够清晰;已更新答案,加入了第二个选项。 - Dvir
$newString = substr($string, 0, strpos($string, " CIK#")+5); 用$companyname替换$newString也不起作用。 - Steven Matthews
或许还有一些我看不到的其他部分吗?我正在从网页的HTML中提取它。这可能是为什么它不起作用的原因吗?你使用设置$string为问题字符串的示例运行得很好。但是我需要的正常的那个却不起作用。 - Steven Matthews
你需要展示一个HTML样本和你编写的未能正确获取字符串的脚本;我建议先在HTML解析方面寻找答案,如果没有满足你的答案,再提出一个新问题,因为这是一个全新的主题。祝你好运! - Dvir
明白了,在我提取了HTML的纯文本副本之后。 - Steven Matthews

3

使用strpos函数可以找到"CORP"的位置(请务必仔细阅读巨大的红色警告),然后再使用substr函数切掉相关部分。


2

我来到这个页面寻找一个切片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"

1
谢谢你的努力!这个问题已经超过7年了,而我现在已经比当时提问时所在的公司进步了3倍!你应该把它制作成一个库,让更多人可以使用。 - Steven Matthews
我有一个代码库,我把我的脚本放在里面,其中包括str_random.php。我没有时间管理/重构这些文件,所以目前我只是把它们丢在那里 :) - akinuri

0
假设您的字符串存储在 $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")); 尝试这样做,却一无所获。 - Steven Matthews
@Andrew Alexander:可能只是一个简单的错误。你确定你的字符串内容是你指定的吗?如果是,你是否正确地输出了相应的结果? - JRL
据我所知,我该如何检查并查看我的字符串是否包含任何echo未显示的其他信息?字符串中有一个链接 - 我想这可能会引起问题? - Steven Matthews
1
我对PHP中的切片操作一无所知,非常抱歉。 - Steven Matthews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接