查找并替换数组

时间:2015-08-31 20:54:19

标签: php regex preg-replace

我有一个非常大的数据库,其中一些数据以此格式列出,与 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 />";
}

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

1 个答案:

答案 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