2016-07-14 14 views
1

我想检查search pattern的前一个字符是否是字母数字字符。如何使用PHP检查RegEx搜索模式的前一个字符?

如果属实,则什么也不做。

如果调整,删除前面的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来实现?

+0

你的意思是模式应该是“XYZ”,不能修改? –

回答

4

你可以使用一个\B XYZ模式,并使用preg_replace_callbacktrim匹配值,并插入回:

$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只会匹配一个非字字符。

更多详细信息:您的图案以空格开始。这是一个非字字符。通过在它之前加上\B,我们要求空格之前的字符也应该是非字字符。否则,我们将无法匹配。字符char是来自[a-zA-Z0-9_]范围的字符。如果您需要自定义边界,请使用类似于(?<![a-zA-Z0-9])的倒序列表从边界字符中排除下划线。

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

+1

如果您需要比任何非单词边界更具体,可以使用后视图,例如'(?<= [a-zA-Z0-9])XYZ' –

+0

@ Wiktor-Stribiżew解决方案作品,但我很难理解它。我看到的唯一区别是'PHP_EOL',它与字母数字字符有什么关系? – KDX

+0

@ Steven-Doggart你提出的想法很有趣,你想介绍一下样本答案吗?它看起来像给了我更多控制什么匹配,并可能更好地适合我的国际语言项目。 – KDX

相关问题