如何使用PHP检查RegEx搜索模式的前一个字符?

时间:2016-07-14 14:57:36

标签: php regex preg-replace

我想检查search pattern的前一个字符是否是字母数字字符。

如果是,请不要做任何事。

如果是,请删除space中的前一个search pattern

例如:

$string1 = "This is a test XYZ something else";

$string2 = "This is a test? XYZ something else";

$pattern = " XYZ";

在$ string1场景中,搜索模式的前一个字符为t并被视为匹配,不会执行任何操作。

在$ string2场景中,搜索模式的前一个字符为?并被视为不匹配,我正在移除searhc pattern中的额外空格。

成功:

$string2 = "This is a test?XYZ something else";

如何在PHP中实现?

1 个答案:

答案 0 :(得分:4)

您可以使用\B XYZ模式并使用preg_replace_callback trim匹配值并将其插回:

$string1 = "This is a test XYZ something else";
$string2 = "This is a test? XYZ something else";
$pattern = " XYZ";
echo preg_replace_callback('~\B'.$pattern.'~', function($m) { return trim($m[0]); }, $string1) . PHP_EOL;
// => This is a test XYZ something else
echo preg_replace_callback('~\B'.$pattern.'~', function($m) { return trim($m[0]); }, $string2);
// => This is a test?XYZ something else

请参阅PHP demo

由于\B匹配除了与单词边界(非单词边界)匹配的位置以外的位置,因此模式\B XYZ仅在非单词char之后匹配。

更多细节:您的模式以空格开头。这是一个非单词char。通过在它之前添加\B,我们要求空格前的字符也应该是非字char。否则,我们将无法匹敌。 char这个词是来自[a-zA-Z0-9_]范围的字符。如果您需要自定义边界,请使用(?<![a-zA-Z0-9])之类的lookbehind从边界字符中排除下划线。

有关非字边界的详细信息,请参阅this What are non-word boundary in regex (\B), compared to word-boundary? SO thread