2014-09-04 145 views
0

我有一個字符串,其中包含一些數字和文本,我試圖在第一個非數字字符處拆分字符串。preg_split將字符串轉換爲數組中的第一個非數字字符

例如,我有幾個字符串像

$value = '150px'; 
$value = '50em'; 
$value = '25%'; 

我一直試圖分裂使用使preg_split和一點點正則表達式的字符串。

$value_split = preg_split('/[a-zA-Z]/' , $fd['yks-mc-form-padding']);

我能夠得到使用$value_split[0]字符串的第一部分,例如我可以存儲150或50或25。我需要返回字符串的第二部分,以及(PX ,em或%)。

如何分割字符串使用preg_split或類似的東西返回數組的兩部分?

謝謝!

回答

3

如果你想使用正則表達式,你還沒有,你應該玩RegExr

做你用正則表達式想什麼,假設所有的字符串將是所有的數字在一起,然後所有非數字,你可以這樣做:

$matches = array(); 
preg_match('/([0-9]+)([^0-9]+)/',$value,$matches); 

然後$matches[1]將是數字部分$matches[2]將其餘

要打破它,
[0-9]匹配任何數字字符,所以[0-9]+匹配1個或多個數字字符成一排,所以每the docs$matches[1]將有(NU聚體)文本由第一組括號

[^0-9]的匹配在匹配任何非數字字符,所以[^0-9]+匹配1個或多個非數字字符的行和填充$matches[2]因爲它是在第二組括號

+0

哇,似乎工作得很好。我會和它一起玩,看看它是否一致。謝謝Jakar,並感謝RegExr網站資源,我以前沒有見過! – EHerman 2014-09-04 18:27:24

+0

不客氣。只要所有'$ value'都只是數字字符,後面跟着非數字字符(如123a%b),那麼它將在100%的時間內工作。 – Jakar 2014-09-04 18:49:37

+0

好,但嘗試使用'\ d'和'\ D'而不是'[0-9]'和'[^ 0-9]' – pguardiario 2014-09-05 01:45:03

2

通過preg_split()你不能達到你想要的。它會刪除你的字符串中分隔整個字符串的部分(在這種情況下,它將用字符[a-zA-Z]分開)。使用preg_match()(或preg_match_all())功能。

您可以使用此模式:

/([0-9]+)([a-zA-Z%]+)/ 

demo

+0

使用'[^ ​​0-9]'爲第二個匹配是更通用的比'[a-zA-Z _%@#]'多,因爲它匹配任何非數字字符而不是指定的少數字符。但是,鑑於用例,它可能無論如何都不重要。 – Jakar 2014-09-04 19:04:22

+1

我完全同意你的看法,但我不想看起來像我抄襲你:)。但對於這種情況,這是不相關的,因爲他想要3個值可能對於有3種格式(px,em和%)的CSS。所以'_ @#'這樣的字符在這裏並不重要。我將編輯。 – 2014-09-04 19:10:20

0

使用PREG_SPLIT_OFFSET_CAPTURE標誌 - 它會導致返回一個數組,其中item [0]是匹配的字符串,item [1]是它在原始字符串中的起始位置。 然後,您可以使用該信息通過使用普通的子字符串功能來提取字符串的其餘部分。 沿線的東西:

$values_split = preg_split('/[a-zA-Z]/' , $fd['yks-mc-form-padding']); 
$position = $values_split[0][1] 
$length = $values_split[0][0] 
$startPos = $position + $length 
$numToGet = lenght($input) - $startPos 

$remainder = substr($inline, startPos, $numToGet) 
相關問題