【问题标题】:Return the portion of a string before the first occurrence of a character in PHP [duplicate]在PHP中第一次出现字符之前返回字符串的一部分[重复]
【发布时间】:2010-09-22 04:27:13
【问题描述】:

在 PHP 中,返回第一次出现特定字符之前的字符串部分的最简单方法是什么?

例如,如果我有一个字符串...

“快速的棕色狐狸跳过等等。”

...并且我正在过滤空格字符(“”),该函数将返回 “那个”

【问题讨论】:

标签: php string


【解决方案1】:

对于谷歌员工:strtok 更适合:

echo strtok("The quick brown fox", ' ');

【讨论】:

  • strtok 唯一的缺点是,如果找不到令牌,它会返回整个字符串。
  • 除非你想要的是整个字符串。这正是我所需要的。感谢您明确说明。
  • 正是我需要的(包括整个字符串)。也不需要任何错误处理。谢谢!
  • 如果你的字符串以'token'开头,它会被跳过;它不会在第一个“令牌”之前返回空字符串;它将返回“令牌”之间的第一个非空部分。如果您传递一个空字符串,它还将返回false(不是空字符串)。一些陷阱。
【解决方案2】:

可以这样做:

$string = 'The quick brown fox jumped over the lazy dog';
$substring = substr($string, 0, strpos($string, ' '));

但我更喜欢这个更好

list($firstWord) = explode(' ', $string);

【讨论】:

  • 不会抛出错误吗?我认为对于要爆炸的数组中的变量数量,链接必须有一个匹配的变量集(或空逗号分隔)?
  • 如果你想返回变量而不是分配它return array_shift(explode(' ', $string));
  • 如果未找到字符串(此处为空格),则第一个返回空字符串。第二个返回整个字符串。
  • 您也可以在explode(…) 中使用limit 参数,这样$string 就不会被扫描超过需要的部分:list($firstWord) = explode(' ', $string, 2);
【解决方案3】:

strstr() 查找第一次出现的字符串。返回 haystack 字符串的一部分,从第一次出现 needle 到 haystack 结尾。

第三个参数:如果为 TRUE,strstr() 返回第一次出现针之前的大海捞针部分(不包括针)。

$haystack  = 'The quick brown foxed jumped over the etc etc.';
$needle    = ' ';
echo strstr($haystack, $needle, true);

打印The

【讨论】:

  • 我尝试了这段代码并收到警告:“strstr() 的参数计数错误”。原因是此代码仅适用于 PHP 5.3.0。我使用的是早期版本的 PHP。
  • 如果未找到针头,则返回 false。这是你所期望的。所以就个人而言,这感觉是更好的答案。在许多其他答案中,您可能还需要检查字符串是否包含令牌,否则您会得到不可预测的结果。除非当然是给定的。
  • 简洁明了,具有良好的命名约定,便于清晰理解。
  • 这个答案应该有更多的支持,因为我使用strstr 将大文本 int 减半,strstr 上下工作:) ;
【解决方案4】:

总而言之,有四种方法。分隔符=:

  1. strstr($str, '=', true);
  2. strtok($str, '=');
  3. explode('=', $str)[0]; // Slowest
  4. substr($str, 0, strpos($str, '='));

此表说明了输出差异。其他输出非常同构。

+-------+----------------+----------+-------+----------------+-------+-------+
| $str  | "before=after" | "=after" | "="   | "no delimeter" | 1     | ""    |
+-------+----------------+----------+-------+----------------+-------+-------+
| 1.    | "before"       | ""       | ""    | false          | false | false |
| 2.    | "before"       | "after"  | false | "no delimeter" | "1"   | false |
| 3.    | "before"       | ""       | ""    | "no delimeter" | "1"   | ""    |
| 4.    | "before"       | ""       | ""    | ""             | ""    | ""    |

如果出现多字节问题,请尝试例如mb_strstr

mb_strstr($str, 'ζ', true);

进一步注意:explode 似乎更直接,处理多字节并通过在分隔符前后传递第三个参数返回

explode('ζ', $str, 2);

【讨论】:

  • 如果针之前的子串是假的,那么假的三元检查并不总是可靠的。问题:3v4l.org/AQXhc 此外,strpos($str, ' ') 可能返回false 或偏移0。那行代码也不可靠。
  • 这似乎是一个真正的机会,您可以通过edit 改进您的答案。与研究人员分享见解时,请始终保持慷慨、可靠和准确。
  • 希望现在有所改进
【解决方案5】:

使用这个:

$string = "The quick brown fox jumped over the etc etc.";

$splitter = " ";

$pieces = explode($splitter, $string);

echo $pieces[0];

【讨论】:

  • 如果未找到拆分器,则返回整个字符串。
  • @Soaku,这只是一个观察。
  • explode() 应该受到限制。应该解释这个答案——不仅仅是为了教育,而是为了让搜索引擎有一些东西可以咀嚼。
【解决方案6】:

strtok() 函数将字符串分割成更小的字符串, 例如:

$string = "The quick brown";
$token = strtok($string, " "); // Output: The

如果你没有空格:打印所有字符

$string = "Thequickbrown";
$token = strtok($string, " "); // Output: Thequickbrown

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2015-12-08
    • 2015-10-09
    • 1970-01-01
    • 2018-10-16
    • 2015-05-04
    • 2018-11-16
    相关资源
    最近更新 更多