18

我有一个有名称的数据库,我想在名称的空格后使用 PHP 替换,数据示例:

$x="Laura Smith";
$y="John. Smith"
$z="John Doe";

我希望它返回

Laura
John.
John
4

8 回答 8

28

只是为了将其添加到混合中,我最近学习了这项技术:

list($s) = explode(' ',$s);

不过,我只是做了一个快速的基准测试,因为我之前没有遇到过 strtok 方法,并且在给出的示例字符串上,strtok 比我的列表/爆炸解决方案快 25%。

此外,初始字符串越长/分隔越多,性能差距就越大。给出一个 5000 个单词的块,explode 将创建一个包含 5000 个元素的数组。strtok 将只取第一个“元素”并将其余的作为字符串留在内存中。

所以 strtok 为我赢得了胜利。

$s = strtok($s,' ');
于 2013-10-19T13:18:47.673 回答
26

这样做,这将替换空格字符之后的任何内容。也可以用于破折号:

$str=substr($str, 0, strrpos($str, ' '));
于 2012-08-29T12:19:57.410 回答
13

试试这个

<?php
$x = "Laura Smith";
echo strtok($x, " "); // Laura
?>

斯托克

于 2012-08-29T12:26:18.413 回答
6

不需要使用正则表达式,只需使用explode方法即可。

$item = explode(" ", $x);
echo $item[0]; //Laura
于 2012-08-29T12:21:09.873 回答
1

TheBlackBenzKid 提供的方法对该问题有效 - 但是当出现不包含空格的参数时,它将返回一个空白字符串。

尽管正则表达式的计算成本更高,但它们提供了更多的灵活性,例如:

function get_first_word($str)
{
 return (preg_match('/(\S)*/', $str, $matches) ? $matches[0] : $str);
}
于 2012-08-29T12:29:14.387 回答
1

有一个未提及的函数调用,我一直用于这个确切的任务。

第三个参数为 true 的strstr()将返回第一次出现针字符串之前的子字符串。

代码:(演示

$array = [
    'x' => 'Laura Smith',
    'y' => 'John. Smith',
    'z' => 'John Doe'
];

foreach ($array as $key => $value) {
    $array[$key] = strstr($value, ' ', true);
}

var_export($array);

输出:

array (
  'x' => 'Laura',
  'y' => 'John.',
  'z' => 'John',
)

注意,如果在字符串中没有找到 needle,strstr()将返回false.

ps

  • 因为有单功能技术来执行此任务,所以没有令人信服的理由使用多功能技术来完成相同的工作。
  • 因为 needle 是一个静态字符串(一个空格),所以绝对没有理由引入 regex call 的开销
  • 如果有人正在考虑使用explode()来生成临时数组,而不是更直接的“字符串输入 - 字符串输出”操作,例如strtok()or strstr(),请务必声明使用表示目标元素索引的整数的第三个参数explode()+ 1 --这样,该函数将在隔离您查找的子字符串后立即停止创建新元素。
于 2020-04-13T22:17:08.657 回答
0

你也可以这样做

$str = preg_split ('/\s/',$x);
print $str[0];
于 2012-08-29T12:23:13.310 回答
0

这个答案将删除第一个空格之后的所有内容,而不是最后一个空格,就像接受的答案一样。使用strpossubstr

$str = "CP hello jldjslf0";
$str = substr($str, 0, strpos( $str, ' '));
echo $str;
于 2017-08-17T12:41:37.247 回答