在数组中查找和替换具有特定字符模式的字符串

Finding and replacing strings with certain character patterns in array

我有一个相当大的数据库,其中一些数据以这种格式列出,并与 keywords 列中的另一组单词混在一起。

BA 093RJ 342ES 324

字符本身总是不同,但结构保持不变。我想更改所有遵循此字符结构的字符串:2 个字符 A-Zspace 3 个字符 0-9 到以下:

BA-093RJ-342ES-324

请注意,这些字符串与一堆其他字符串混合在一起,因此我需要在替换空 space 之前将它们隔离开来。这是一个示例字符串:

Km 111 aracoiaba Araçoiaba sp 270 spvias vias sao paulo Araçoiaba Bidirecional

sp 270 是我们要改变的位。

编辑:还有一个例外,如果 KM 是前两个字符,则应忽略该条件,它由答案之一处理

我已经编写了脚本的开头部分,该脚本会获取所有数据并将其显示在浏览器上以找到解决方案,但我不确定如何处理我的 if 语句来隔离字符串并替换它们。而且由于我使用的是 explode,它可能会将上面的数据分别转换为两个单独的数组,这使事情变得更加复杂。

<?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 />";
}

感谢任何帮助。提前谢谢你。

这个正则表达式应该可以做到。

([A-Z]{2})\h(\d{3})

表示两次 A-Z 之间的任何字符 ({2})。一横白space\h。然后三个{3}个数字\d() 捕获您要捕获的值。所以 </code> 和 <code> 有找到的值。

Regex101 演示:https://regex101.com/r/nU2yN0/1

PHP 用法:

$string = 'BA 093, RJ 342, ES 324';
echo preg_replace('~([A-Z]{2})\h(\d{3})~', '-', $string);

输出:

BA-093, RJ-342, ES-324

您可能需要 (?:^|\h)([A-Z]{2})\h(\d{3}),这要求大写字母中没有文本 运行。例如 AB 345, cattleBE 123, BE 678。使用此正则表达式 cattleBE 123 将找不到。不确定你对这个例子的意图是什么,所以我会把它留给你..

?: 使 () 不在那里捕获。 ^ 这样大写字母就可以作为字符串的开头。 |or\h 是另一个水平的 space。如果你也想允许换行,你可以用 \s 代替 \h

更新:

(?!KM)([A-Z]{2})\h(\d{3})

这将忽略以 KM 开头的字符串。 https://regex101.com/r/nU2yN0/2