2013-07-11 68 views
-2

再次編輯,以試圖使其更清晰。正則表達式分裂字符串,如果它包含wordA或wordB

很多php正則表達式模式會給我一個匹配數組,包含總是2個值,這是由「wordA」或「wordB」分割的字符串的2部分。 如果字符串不包含這些單詞,只需返回字符串作爲第一個數組在第二個數組中爲null。

例:

preg_match("pattern","foo wordA bar",$match), $match will contain array['foo', 'bar'] 
preg_match("pattern","foo wordB bar",$match), $match will contain array['foo', 'bar'] 
preg_match("pattern","foo bar test",$match), $match will contain array['foo bar test', null] 

我知道,$匹配的第一個值始終是字符串,所以我不寫。

老問題:

我需要一個行地址分成部分。 我無法找到捕獲街道部分的方法,但不包含APP或APT詞(如果有的話),如果存在的話,抓住它後的單詞。

對於爲例:

「5847A,芸香主要APP A」 應符合:(5847,A,芸香校長,A)

「5847A,芸香亞瑟王子APT 22」 應符合:(5847 ,A,芸香亞瑟王子,22)

「1111,舍伍德街」 應符合:(1111,舍伍德街道)

我使用PHP。

我到目前爲止是:/^(\d+)(.*), (.*)(?:APP|APT)(?:\s*(.*))?$/i這與例1和2如何我如果嘗試通過添加一個替代(APP | APT)optionnal?之後,第三場比賽包括單詞APP或APT ...

任何想法如何從比賽中排除選項和替代APP或APT字?

謝謝

編輯:

我可以簡化這個問題:我怎麼能正則表達式的字符串,所以比賽返回相同的字符串減去字APP或APT,如果他出現在它的中間。

+2

這是一個非常糟糕的主意。地址有許多不同的形狀和大小。要麼設置一個標準格式並使用它,要麼用另一個意思解析它。使用正則表達式意味着有一個恆定的模式。當使用任意地址作爲地址時,沒有這種方式。 –

+0

我可以簡化這個問題:如何將一個句子正則表達,以便匹配返回相同的字符串減去APP或APT字,如果他出現在它的中間。 –

+0

查看['str_replace()'](http://il1.php.net/manual/en/function.str-replace.php)以刪除APP或APT。 –

回答

0

由於@MadaraUchiha指出的那樣,這是一個壞主意,在地址上運行一個正則表達式,因爲它們可以在任何格式工作。

如果你知道你有一致的地址,那麼我想你可以使用正則表達式:

^([0-9]+)([A-Z])?,\s(?:(.*?)\s(?:APP|APT)\s(.*)|(.*))$ 

而更換:

$1,$2,$3$5,$4 

Here的廣告的效果如何。

它與您的非常相似(我改變了一些東西),並添加了一個或(|)運算符來解決第二種類型的地址,而不使用APPAPT

如果你想要一致數量的匹配,也許這樣?

^([0-9]*)([A-Z]?),((?:(?!\sAPP|\sAPT).)*)(?:\sAPP|\sAPT)?(.*)$ 

Regex101 example

+0

這幾乎是它,但是這是給我與結果匹配數組的不同索引中的不同部分的匹配數量不一致。 –

+0

@JfRondeau我不知道爲什麼你要解決更復雜的比它已經是...但它是由你我猜...更新我的答案。 – Jerry

0

爲「易」版本

var_dump(preg_replace ("/ apt|app /i" , "" ,"5847A, rue Prince Arthur APT 22" )); 

覆蓋它

輸出

5847A, rue Prince Arthur 22 

較硬的版本,你就需要更多像爲什麼逗號出現像他們這樣做背景。

硬盤版本

([0-9]*)([a-z]?),(((?!app|apt).)*)(?:app|apt)?(.*) 

似乎對你的測試用例

+0

結果中的逗號僅用於顯示$ match數組的內容。 –

+0

「1111,舍伍德街」,那是一個錯誤,然後有2個逗號? – exussum

+0

不,我的意思是,正則表達式的結果應該給我一個包含4值的匹配數組。 「1111,舍伍德街道」,意味着陣列( 「1111」,NULL, 「舍伍德街」,NULL) –

0

我認爲這應該工作:

$pattern = "/\bAPP|APT\b/i"; 
$subject = "1111, Sherwood street"; 
echo preg_replace($pattern, "", $subject); 
相關問題