我有一个非常大的数据库,其中一些数据以此格式列出,与 keywords 列中的另一组词混合在一起。
BA 093 , RJ 342 , ES 324 等。
角色本身总是不同但结构保持不变。我想更改遵守此字符结构的所有字符串: 2个字符AZ ,空间, 3个字符0-9 到以下:
BA-093 , RJ-342 , ES-324 等。
请注意这些字符串与一堆其他字符串混在一起,因此我需要在替换空字符之前将它们隔离。这是一个示例字符串:
Km 111 aracoiaba Araçoiaba sp 270 spvias vias sao paulo Araçoiaba Bidirecional
sp 270 是我们想要改变的一点。
编辑:还有一个例外,如果KM是前两个字符,它应该忽略条件,它由其中一个答案处理
我已经编写了脚本的开头,它接收所有数据并在浏览器上显示它以找到解决方案,但我不确定如何处理 if 语句以隔离字符串并替换它们。而且由于我正在使用爆炸,它可能将上面的数据分别变成两个独立的数组,这使事情变得更加复杂。
<?php
require 'includes/connect.php';
$pullkeywords = $db->query("SELECT keywords FROM main");
while ($result = $pullkeywords->fetch_object()) {
$separatekeywords = explode(" ", $result->keywords);
print_r ($separatekeywords);
echo "<br />";
}
感谢任何帮助。提前谢谢。
答案 0 :(得分:3)
这个正则表达式应该这样做。
([A-Z]{2})\h(\d{3})
这表示A-Z
两次({2}
)之间的任何字符。水平空白区\h
。然后是三个{3}
个数字\d
。 (
和)
捕获您要捕获的值。因此,$1
和$2
具有找到的值。
Regex101演示:https://regex101.com/r/nU2yN0/1
PHP用法:
$string = 'BA 093, RJ 342, ES 324';
echo preg_replace('~([A-Z]{2})\h(\d{3})~', '$1-$2', $string);
输出:
BA-093,RJ-342,ES-324
您可能需要(?:^|\h)([A-Z]{2})\h(\d{3})
,这需要大写字母不会有文字。例如AB 345, cattleBE 123, BE 678
。有了这个正则表达式cattleBE 123
将无法找到。不知道你对这个例子的意图是什么,所以我会把它留给你......
?:
使()
非捕获。 ^
是大写字母可以是字符串的开头。 |
为or
,\h
为另一个水平空间。如果您想允许换行,也可以\s
代替\h
。
更新
(?!KM)([A-Z]{2})\h(\d{3})
这将忽略以KM
开头的字符串。 https://regex101.com/r/nU2yN0/2