如何使用正则表达式在第一个非字母数字字符处截断上述字符串(理想情况下截断后没有残留的尾随空格)?
非字母数字字符不会提前知道,但它们可能是连字符、逗号、左括号等。我只想保留符号之前的前导词。
输入字符串:
iPhone 7 plus - space grey (New)
iPhone6 plus, brand new, (Used)
iPhone 5 ( black)
期望的结果:
iPhone 7 plus
iPhone6 plus
iPhone 5
一个简单的 preg_match 就可以解决问题。
preg_match("/[a-zA-Z0-9 ]+/", $str, $match);
它将匹配多个单词(a-Z)、数字和空格。
如果不需要第二部分,只需匹配第一部分即可:
preg_match('/[A-Z0-9\s]+/i', $string, $match);
echo $match[0];
匹配字母
A-Z
、数字 0-9
和空格 \s
一次或多次 +
不区分大小写 i
。
您可以使用正则表达式来做到这一点。
$input = 'iPhone6 plus, brand new, (Used)';
$items = preg_split('/[^A-Za-z0-9\s]/i', $input);
echo $items[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));