2015-06-26 52 views
2

我想解決以下問題:在括號內獲取文字

我通過imap獲取郵件;現在我使用正則表達式來獲取兩個quare括號(Ticket-ID)之間的文本。

例如:[Ticket-ID: 84824] Re:Test

preg_match("/\[Ticket-ID: (\S+)\]/", $mail->subject, $matches) 

得到84824的結果 - 但我如何能得到 「回覆:測試」 或只是 「測試」 用PHP?

現在我想得到沒有任何票號的純主題等等。我該如何解決這個問題?

+0

像這樣,與捕獲組:['\ [票證ID:(\ S +)\] \ S *(?: (Re)的:)(\ S *)'](https://regex101.com/r/oJ7bX0/2)? –

回答

2

你可以在你的正則表達式使用一個以上捕獲組是這樣的:

preg_match("/\[Ticket-ID: (\S+)\]\s*(.*)/", $mail->subject, $matches) 

這將捕獲「回覆:測試」在第二場比賽,所以你可以從$matches[2]

+0

這已經很好了 - 但是如果最後一個支架和「測試」之間有空間,這個空間也會被覆蓋:所以它是「測試」而不是「測試」 – MyFault

+0

@MyFault,oops ...它應該在第二個捕獲組之前就有貪婪的's s *',而不是懶惰的'\ s *?'。查看更新的答案。 –

+0

太棒了!謝謝! – MyFault

1

你可以這樣做:

\[[\s\S]+\][\s]*(.*) 

DEMO

Regular expression visualization

示例代碼:

<?php 

$str ='[Ticket-ID: 84824] Re:Test'; 
preg_match('/\[[\s\S]+\][\s]*(.*)/',$str,$matches); 
echo $matches[1]; 

?> 

輸出:

Re:Test 

如果你只想要Test,使用下面的正則表達式:

\[[\s\S]+\][\s]*Re:(.*) 
0
$string='[Ticket-ID: 84824] Re:Test'; 
$bracket_location=strpos($string,'] '); 
$subject=substr($string,$bracket_location+2,strlen($string)-$bracket_location+2); 

Lo通過你的匹配,你的$主題將給你重新:測試。

0

嘗試此正則表達式:\[[^:]+:\s*(\d+)\]

$re = "/\\[[^:]+:\\s*(\\d+)\\]/"; 
$str = "[Ticket-ID: 84824] Re:Test"; 

preg_match($re, $str, $matches); 

Demo