在数组中查找和替换具有特定字符模式的字符串
Finding and replacing strings with certain character patterns in array
我有一个相当大的数据库,其中一些数据以这种格式列出,并与 keywords 列中的另一组单词混在一起。
BA 093、RJ 342、ES 324等
字符本身总是不同,但结构保持不变。我想更改所有遵循此字符结构的字符串:2 个字符 A-Z、space、 3 个字符 0-9 到以下:
BA-093、RJ-342、ES-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
我有一个相当大的数据库,其中一些数据以这种格式列出,并与 keywords 列中的另一组单词混在一起。
BA 093、RJ 342、ES 324等
字符本身总是不同,但结构保持不变。我想更改所有遵循此字符结构的字符串:2 个字符 A-Z、space、 3 个字符 0-9 到以下:
BA-093、RJ-342、ES-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