我正試圖用文本正文中的X替換除價格(以$開頭的數字)之外的所有數字。我一直試圖用後面的眼光來完成這項工作,但似乎並不奏效。這裏是我現在使用的:匹配不是價格的數字
$comments = preg_replace("/(?<!$)([0-9]+)/", "x", $comments);
這最終只是用X替換所有的數字,包括那些前面有$的。
我正試圖用文本正文中的X替換除價格(以$開頭的數字)之外的所有數字。我一直試圖用後面的眼光來完成這項工作,但似乎並不奏效。這裏是我現在使用的:匹配不是價格的數字
$comments = preg_replace("/(?<!$)([0-9]+)/", "x", $comments);
這最終只是用X替換所有的數字,包括那些前面有$的。
您需要使用反斜線,\$
美元符號,否則被解釋爲行/字符串的結尾。
而且,設置第二個括號是完全沒有必要 - 你不使用你捕獲組。
哦,爲了避免更換一些類似於$ 100的東西,您需要將0-9添加到您的負面後臺上...因爲您這樣做,您可以簡單地將美元放在角色類中,並且不需要轉義。
所以在這一點上,我們有:
$comments = preg_replace("/(?<![$0-9])[0-9]+/", "x", $comments);
但顯然「的preg_replace不支持repition在向後看」 - 這是我要帶去意味着你不能把0-9的向後看,所以在它之前放置一個字邊界。
也未嘗避免被替換$ 9.99,所以希望我們可以指定\ d。在看後面禁止這一點。
所以,你的代碼最終變爲:
$comments = preg_replace("/(?<!\$|\d\.)\b[0-9]+\b/", "x", $comments);
有了這一切增加了複雜性,你需要創建一些測試案例,以確保按預期工作。
$
是在正則表達式一個特殊字符(表示字符串的末尾)。你需要逃避它:\$
也作爲目前的公式,你的lookbehind可能只會阻止它取代價格的第一位數;因爲在第一個數字之後,由於你不再是$,後向將繼續匹配。
你可能想使用的東西,包括\b
(字邊界)來限制匹配的數字序列,以唯一全數字的開頭和結尾。
這應該也行:
/(?<=\s)[0-9]+/
這個:'(?<= \ s)(?<!\ $)'沒有意義。如果後面的第一個字符'(?<= \ s)'匹配,第二個字符'(?<!\ $)'不可能匹配。 – 2009-11-02 23:00:53
我試圖逃跑的美元符號,但問題仍然存在。 – Iainzor 2009-11-02 22:21:18