如何从字符串中删除“-”后面的任何内容?

21

这是我的字符串示例。

$x = "John Chio - Guy";
$y = "Kelly Chua - Woman";
我需要正则表达式替换的模式。
$pattern = ??
$x = preg_replace($pattern, '', $x); 

谢谢

7个回答

70

无需使用正则表达式。您可以使用 explode 函数:

$str = array_shift(explode('-', $str));

或者使用substrstrpos函数:

$str = substr($str, 0, strpos($str, '-'));

可能需要结合trim函数来去除前后空格。

更新:正如@Mark所指出的那样,如果您要获取的部分包含 -, 这种方法将失败。这完全取决于您的输入情况。

因此,假设您想要删除最后一个破折号之后的所有内容,您可以使用strrpos函数,该函数可查找子字符串的最后一个出现位置:

$str = substr($str, 0, strrpos($str, '-'));

所以你看,这里不需要正则表达式 ;)


@Mark Byers:这取决于问题的要求,它仍然会删除-后面的所有内容。但考虑到问题的结构,可以通过在“ - ”(空格减空格)上分裂来解决这个问题。 - Felix Kling
2
个人而言,我更喜欢使用substr这个第二种选择,因为在PHP 5.3中,使用array_shift选项会导致"只有变量可以通过引用传递"的警告。 - crmpicco
如果字符串中没有任何“-”,则使用第二个选项返回null而不是字符串。 - AbhimanuSharma

9

如果你想在代码中删除第一个连字符后面的所有内容,可以使用以下正则表达式:

"/-.*$/"

要移除最后一个连字符后的所有内容,您可以使用以下正则表达式:
"/-[^-]*$/"

http://ideone.com/gbLA9

您还可以将其与从结果末尾修剪空格相结合:

"/\s*-[^-]*$/"

9
您可以使用 strtok 函数:
$x = strtok($x, '-');

5
您也可以使用。
strstr( "John Chio - Guy", "-", true ) . '-';

第三个参数true告诉函数返回第二个参数第一次出现之前的所有内容。 源自php.net的strstr()函数说明

你的解决方案是否比上面几个答案中给出的 '$str = substr($str, 0, strpos($str,'-'));' 更高效?根据它没有使用嵌套函数,我会认为它更高效,但这并不一定是真的。有什么想法吗? - Phill Healey

0
我希望这些模式能对你有所帮助 =]
$pattern1='/.+(?=\s-)/'       //This will match the string before the " -";
$pattern2='/(?<=\s-\s).+/'    //This will match the string after the "- ";

0

使用explode或regexp会有些过度,可以尝试这个:

$str = substr($str, 0, strpos($str,'-'));

或者在这里的答案中使用strtok版本。


1
双重名称失败:http://ideone.com/Ufu3h 在此处查看可行的解决方案:https://dev59.com/uW445IYBdhLWcg3wws8u#4705179 - Mark Byers

-1

使用 strstr 函数。

示例:

$my_string = "This is my best string - You like it?";
$my_new_string = strstr($my_string, '-', true);

echo($my_new_string);

这基本上与8个月前用户2453885给出的答案相同。 - Phill Healey

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