2013-05-18 28 views
4

我需要通過分隔符來分割一個字符串,這些分隔符對我而言也是未知的。 例如我知道我想通過「\ n」和「,」和「。」分割字符串。而且還有1個可以由用戶定義的說明者:例如它可以是「;」或「你好」或幾乎任何東西。php - 由未知正則表達式分割

我嘗試這樣做:

"[\n|,|.|".$exp."]" 

...但沒有工作預期。據我所知|意味着或。所以這個reg exp應該說是按「\ n」或「,」或「。」分割。或「你好」。 我認爲它是因爲如果我嘗試[你好]然後它分裂每個字母,而不是整個字。這很奇怪,因爲如果我只是嘗試[\ n],那麼它只會被「\ n」分隔 - 而不是「\」或「n」。

有人可以向我解釋這個嗎? :)

+0

括號是用來定義角色的列表,[AB]爲A或B,它是一樣的| b – SmasherHell

回答

6

當你在字符類中放置了一堆字符,如[hello],它定義了一個與h,e,l或o的一個字符匹配的標記。此外,|在字符類中沒有意義 - 它只是與普通字符相匹配。

正確的解決辦法是不使用字符類 - 你想用方括號:

(\n|,|\.|".$exp.")

順便說一句 - 確保你逃避任何正則表達式元字符是在$exp。基本上,這裏的完整列表需要用反斜線進行轉義:http://regular-expressions.info/reference.html可能有一個輔助函數可以幫你完成。

編輯:由於您沒有使用字符類,我們現在需要轉義\.,現在它是一個元字符,意思是「匹配任何東西」。差點忘了。

+0

你打我:D – SolidSnake

+0

明白了,謝謝你和其他所有誰whowsered :) – user1985273

1

\n實際上只有一個字符,一個新的生產線,(在n\表示轉義序列),所以這就是爲什麼它的工作原理和hello沒有。

另外,請記住,允許任意輸入到正則表達式中可能存在安全風險,具體取決於正則表達式的用途,因此請非常小心並確保將輸入清理爲正則表達式。使用此正則表達式

1

嘗試:

preg_split('#[\n,.]|'.$exp.'#', ...); 

注單quots,避免\n越來越被新線取代。

1

刪除[],因爲它們定義了一個字符類。 \n計爲雙引號字符串中的單個字符。只需使用字符串沒有字符類應該工作,因爲你需要:

preg_split("/\n|,|.|$exp/", $input) 
1

使用使preg_split()

例如:

輸入:

$exp = '#'; 
preg_split("/[,.\n$exp]/", "0\n1,2.3#4") 

輸出:

Array ([0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4) 
1

這裏是一個簡單的解決方案:

"(\n|,|\.|".$exp.")" 

,或者你可以不喜歡它:

"([\n,.]|".$exp.")" 
+0

你有它倒退,你需要逃避'.'當它是一個字符類之外,而不是幾時。 – Patashu

+0

沒有注意到..修復 – SolidSnake