2016-07-14 43 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

相關問題