删除第一次遇到非字母数字字符后的字符串剩余部分(保留所有前导空格分隔的“单词”)

问题描述 投票:0回答:4

如何使用正则表达式在第一个非字母数字字符处截断上述字符串(理想情况下截断后没有残留的尾随空格)?

非字母数字字符不会提前知道,但它们可能是连字符、逗号、左括号等。我只想保留符号之前的前导词。

输入字符串:

  • iPhone 7 plus - space grey (New)
  • iPhone6 plus, brand new, (Used)
  • iPhone 5 ( black)

期望的结果:

  • iPhone 7 plus
  • iPhone6 plus
  • iPhone 5
php string truncate
4个回答
4
投票

一个简单的 preg_match 就可以解决问题。

preg_match("/[a-zA-Z0-9 ]+/", $str, $match);

它将匹配多个单词(a-Z)、数字和空格。

http://www.phpliveregex.com/p/kW8


3
投票

如果不需要第二部分,只需匹配第一部分即可:

preg_match('/[A-Z0-9\s]+/i', $string, $match);
echo $match[0];

匹配字母

A-Z
、数字
0-9
和空格
\s
一次或多次
+
不区分大小写
i


0
投票

您可以使用正则表达式来做到这一点。

$input = 'iPhone6 plus, brand new, (Used)';
$items = preg_split('/[^A-Za-z0-9\s]/i', $input);
echo $items[0];

0
投票

所有其他发布的答案都无法修剪分隔符号之前的潜在空白,因此输出字符串并不像应有的那样干净。

preg_match()
和 `preg_split() 是不太直接的工具,因为它们创建一个必须从中访问第一个元素的数组。

更准确地说,您的任务应该描述为“如何从列出的字符第一次出现开始修剪尾随字符?”。当以这种方式重申时,很明显,在返回前导子字符串之前,将输入字符串拆分/分解为数组是不必要的步骤。

从字面上看,您想用空字符串替换字符串中不需要的部分。

对于最干净的输出字符串,需要额外考虑删除列出的字符第一次出现之前的可选空格。这可以避免替换后额外的

rtrim()
调用。

代码:(演示

$strings = [
    'iPhone 7 plus - space grey (New)',
    'iPhone6 plus, brand new, (Used)',
    'iPhone 5 ( black)',
];

var_export(preg_replace('~ ?[-,(].*~', '', $strings));

输出:

array (
  0 => 'iPhone 7 plus',
  1 => 'iPhone6 plus',
  2 => 'iPhone 5',
)

(郑重声明,当输入字符串而不是数组时,

preg_replace()
的工作原理与我的演示中相同)

图案:

 ?     # match zero or one literal space (there is a space before the question mark)
[-,(]  # match one of the listed characters
.*     # match zero or more characters to the end of the string/line

或者,如果您不想要字符黑名单,请在否定字符类中使用白名单。 (演示)

var_export(preg_replace('~ ?[^ [:alnum:]].*~', '', $strings));
© www.soinside.com 2019 - 2024. All rights reserved.