2015-02-10 43 views
0

上運行:使preg_split陣列

preg_split("/MapAttempt /", $subject) 

在給定的輸入字符串:

MapAttempt TASK_TYPE="CLEANUP" TASKID="task_201307250256_0001_m_000320" TASK_ATTEMPT_ID="attempt_201307250256_0001_m_000320_0" START_TIME="1374702854132" TRACKER_NAME="tracker_wsmex3:ip6-localhost/127\.0\.0\.1:43273" HTTP_PORT="50060" . 
MapAttempt TASK_TYPE="CLEANUP" TASKID="task_201307250256_0001_m_000320" TASK_ATTEMPT_ID="attempt_201307250256_0001_m_000320_0" TASK_STATUS="SUCCESS" FINISH_TIME="1374702864491" HOSTNAME="/default-rack/wsmex3" STATE_STRING="cleanup" COUNTERS="{(FileSystemCounters)(FileSystemCounters)[(FILE_BYTES_WRITTEN)(FILE_BYTES_WRITTEN)(21559)]}{(org\.apache\.hadoop\.mapred\.Task$Counter)(Map-Reduce Framework)[(PHYSICAL_MEMORY_BYTES)(Physical memory \\(bytes\\) snapshot)(95113216)][(SPILLED_RECORDS)(Spilled Records)(0)][(CPU_MILLISECONDS)(CPU time spent \\(ms\\))(690)][(COMMITTED_HEAP_BYTES)(Total committed heap usage \\(bytes\\))(200998912)][(VIRTUAL_MEMORY_BYTES)(Virtual memory \\(bytes\\) snapshot)(1214373888)]} 

我收到所需的陣列,而且額外的空指數,爲什麼呢?

而且也是爲什麼會這樣運行:

preg_split("/MapAttempt .* \./", $subject) 

返回空數組?

+0

你期待什麼結果呢? – 2015-02-10 20:33:15

回答

1

您有2個問題。

你得到一個額外的空索引的原因是因爲第一個MapAttempt前面有一個空字符串。

preg_split('/A/', 'xAyAz'); 

會導致

array('x', 'y', 'z') 

preg_split('/A/', 'AyAz'); 

導致一個

array ('', 'y', 'z') 

就像它給你的一切,是前第一上面的例子在第一個輪廓數組的元素 - 但沒有什麼,所以它給你一個空的字符串。

關於第二個問題,你所要求的,按以下條件劃分$主題了:

字符串「MapAttempt」後面加一個空格,接着0或更多的東西,然後一個空格,然後由期。

第二個問題是第一個稍微複雜一些的例子。您的正則表達式旨在匹配主題中的整個第一行。所以你是分裂根據什麼出現第1在$主題。因此,你會得到在界標符之前出現的內容(自從界標符匹配之後的空字符串),那麼第一行不會打印,因爲它全部包含在界標符中(就像preg_split('/ A /',... )不會給你返回數組中的「A」),然後它會給你後面的所有內容(整個第二行)。

(如果問題得以解決,請標記爲答案。我想獲得足夠的聲譽分,這樣我就可以在一些投票!謝謝...)

+0

+,但是,我建議學習[格式選項](http://stackoverflow.com/editing-help)以改進您的答案幷包含指向文檔的鏈接。 – 2015-02-10 20:37:45

+0

對於第二部分多數民衆贊成正是我想要做的,但這會導致數組的空字符串,爲什麼? – bSaraogi 2015-02-10 20:41:09

+0

那麼我得到了答案,preg_split本來就是在每行輸入字符串上運行的 – bSaraogi 2015-02-10 20:54:04