2014-02-23 42 views
1

我想使用正則表達式和preg_replace函數進行替換。這是我的代碼正則表達式匹配任何空格

$verif = "/wordA(\s*)wordB(?! wordc)/i"; 
$replacement = 'wordA wordb wordc'; 
$newvar = preg_replace($verif, $replacement, $article->text); 

如果我們只有wordA和wordB之間有一個空格, 我需要匹配wordA & wordB之間的空格的數量。

例如:

wordA(10或多個空白)wordB - > wordA wordb wordc相同wordA(1空白)wordB - > wordA wordb wordc ...

+1

的'\ S *'將零個或多個空格工作。另外,是否有一個固有的原因,你有捕獲空白和'wordc'? – mrres1

+0

謝謝你的回覆。對不起,但我不明白你的問題。 – user3344311

+0

'(\ s *)'和'(?!wordc)'都是抓圖,我在問是否有抓圖的原因 – mrres1

回答

0

的我用理由一個+而不是'*'是因爲一個加號被定義爲一個或多個前面的元素,其中星號爲零或更多。在這種情況下,我們需要一個更具體的分隔符,所以「一個或多個」空格。

word[Aa]\s+word[Bb]\s+word[Cc] 

將匹配:

wordA wordB  wordC 
worda wordb wordc 
wordA wordb wordC 

的話,在該表達式中,將必須是特異性的,並且爲了(A,B,然後c)

+2

管道在字符類中沒有特殊含義,它是一個文字字符。一個字符類只是一組字符。編寫'[A | a]'與'[| aA]'或'[aA |]'完全相同。你可以用'[aA]'替換它,或者爲什麼不''(?:a | A)'。 –

+0

謝謝你的回覆。 – user3344311

4

你的正則表達式應該工作「原樣」。假設它正在做你想做的事。

wordA(\s*)wordB(?! wordc) 

這意味着比賽wordA後跟0或多個空格,然後wordB,但如果隨後wordc不匹配。請注意0​​和wordc之間的單個空格,這意味着wordA wordB wordc將不匹配,但wordA wordB wordc將會。

下面是一些例子比賽和相關的替代輸出:

enter image description here

注意,所有的比賽都不管更換了多少空間。還有其他幾個要點: -

  • (?! wordc)是負先行,所以你不會匹配線wordA wordB wordc這是假設的目的(是爲什麼最後一行不匹配)。目前您正在依靠?!之後的空格來匹配空格。您可能希望更精確並使用(?!\swordc)。如果要在wordc之前匹配多個空格,則可以使用(?!\s*wordc)來存放0個或更多空間,或者使用(?!\s*+wordc)來存放一個或多個空間,具體取決於您的意圖。 當然,如果你確實想在wordB之後用wordc來匹配行,那麼你不應該使用負面的lookahead。

  • *將匹配0或更多的空格,因此它將匹配wordAwordB。如果您至少需要一個空間,您可能需要考慮+

  • (\s*) - 括號表示一個捕獲組。你是否因爲某種原因捕獲了空白組?如果不是,你可以刪除括號,即只使用\s

更新基於評論

你好的問題不在於表達,但在HTML出把那個不被視爲空白 。這是一個Joomla網站。

保留你原來的正則表達式,你可以使用:

wordA((?:\s| )*)wordB(?!(?:\s| )wordc) 

唯一的區別是,不是正則表達式匹配空格或 。我用\swordc代替wordc,因爲這更明確。請注意,因爲我已經指出,當wordB後面跟着單個空格和wordc時,負面lookohead ?!而不是匹配。如果你想匹配多個空格,那麼看看我上面的評論。我還保留了圍繞空白的捕獲組,如果你不想要這個,那麼就像上面已經描述的那樣去掉括號。

例子匹配:

enter image description here

+0

你好問題不是表達式,但HTML輸出 不被視爲空白。這是一個Joomla網站。任何想法。感謝您的幫助。 – user3344311

+0

@ user3344311 - 查看我的更新,我會稍後添加一些示例。 – acarlon