Preg_replace将下划线转换为空格,除非下划线是给定模式的一部分


preg_replace to turn underscore to space except when underscore is part of a given pattern

我试图采取字符串,如:

$search = "Bob Loblaw + Mark Hamill RT45_part12 foo_092344"

并删除所有非字母数字字符,除非下划线位于RT45_part12

我想要的结果应该是:

"Bob Loblaw Mark Hamill RT45_part12 foo 092344"

preg_replace ("/[^ A-Za-z0-9 _]/", ' ', $ 搜索)

查找RT45_part12的正则表达式为

' b [a-zA-Z] {2,4} [0 - 9] {1, 5} _part [0 - 9] {1, 5} ' b

我不知道如何将这两个组合起来,以便它跳过RT45_part12中的下划线,而是替换derrick后面的下划线。我是否需要使用向前看、向后看的功能?

限制够了吗?

echo preg_replace ( "~[^'w ]++|_(?!part'd{1,5}'b)~i", " ", $mystring);

但如果你想要确定,使用:

echo preg_replace ( "~[^'w ]++|('b[a-z]{2,4}'d{1,5}_part'd{1,5}'b)|_~i", "$1 ", $mystring);

希望对您有所帮助

$search = "Bob Loblaw + Mark Hamill RT45_part12 foo_092_34_4";
echo preg_replace("/[^a-zA-Z0-9 ]|(RT45_part12)/", '$1', $search);
//Bob Loblaw  Mark Hamill RT45_part12 foo092344

echo preg_replace("/[^a-zA-Z0-9 ]|([a-zA-Z]{2,4}[0-9]{1,5}_part[0-9]{1,5})/", '$1', $search);

update(非字母数字字符到空格)(它只适用于在RT45_part12之后有空格)

echo preg_replace("/[^a-zA-Z0-9 ]|([a-zA-Z]{2,4}[0-9]{1,5}_part[0-9]{1,5}) /", '$1 ', $search);