$string = 'Audi MODEL 80 ENGINE 1.9 TDi';
list($make,$model,$engine) = preg_split('/( MODEL | ENGINE )/',$string);
“MODEL”之前的任何字符串都将被视为“MAKE字符串”。
“ENGINE”之前的任何字符串都将被视为“MODEL string”。
“ENGINE”之后的任何字符串都是“ENGINE字符串”。
但是我们通常在这个字符串中有更多的信息。
// possible variations:
$string = 'Audi MODEL 80 ENGINE 1.9 TDi POWER 90Hk TORQUE 202Nm GEAR man DRIVE 2wd YEAR 1996';
$string = 'Audi MODEL 80 ENGINE 1.9 TDi YEAR 1996 NOTE this engine needs custom stage GEAR auto';
$string = 'Audi MODEL 80 ENGINE 1.9 TDi GEAR man YEAR 1996';
$string = 'Audi MODEL 80 ENGINE 1.9 TDi YEAR 1996 DRIVE 2wd';
MODEL
和ENGINE
始终存在,并且始终是字符串的开头。
其余的(POWER
、TORQUE
、GEAR
、DRIVE
、YEAR
、NOTE
)可能会有所不同,包括排序顺序以及它们是否在那里。
由于我们不能确定ENGINE字符串是如何结束的,或者其他关键字中的哪一个将是紧随其后的第一个,所以我认为可以用这些关键字创建一个数组。
然后执行某种字符串搜索,查找与数组中某个关键字匹配的第一个单词。
我确实需要保留匹配的单词。
另一种说法可能是:“如何在数组中每次出现单词时/之前拆分字符串”
3条答案
按热度按时间4uqofj5v1#
如果您希望使用动态关联数组:
1.将
MAKE
添加到字符串前面1.使用
preg_match_all()
捕获格式化字符串中的标签和值对1.使用
array_column()
将匹配列重新构造为关联数组。代码:(Demo)
输出:
这不是一个新概念/技术。唯一需要做的调整是 * 如何 * 识别原始字符串中的键/标签。您可能希望使用explicitly name each label and separate them in the pattern with pipes来代替
[A-Z]+
。请参阅以下其他演示:或者,不使用正则表达式来解析字符串,而是将字符串转换为本地PHP函数可以解析的标准格式。
pbwdgjma2#
要保持关键字包含的"位"不变,您可以使用带有预视的
preg_split
,预视将在空格后拆分任意一个关键字。例如:结果:
如果你想把这些解析成键/值对,很简单:
结果:
wooyq4lh3#
如果你更喜欢非RegEx方法,你也可以把它分解成单独的标记(单词)并构建一个数组。下面的代码对空格做了一些假设,如果它是一个问题,可以通过替换来解决。
输出:
演示:https://3v4l.org/D4pvl