2012-05-31 60 views
1

我不能爲我的生活似乎能夠弄清楚我如何提取字符之間的字符。PHP的正則表達式,提取指定的字符之間的字符

考慮這個字符串,

$string = "sometext/#a=10/#b=25/moretext"; 

我希望做的是提取的「A」和「B」的值(10和25)

所以基本上我想要做的是找到「#a =」並在下面的/之前抓住一切,然後對b做同樣的處理。誰能告訴我這是如何實現的?

此外,如果有人知道任何可靠的正則表達式教程,他們可以推薦我非常感謝它,我已經檢查了nettuts,w3schools和php.net,它們都有很好的,但其他任何推薦都會很棒。謝謝。

回答

4

這個工作對我來說:

<?php 

$string = "sometext/#a=10/#b=25/moretext/#varname=Hello World/evenmoretext/"; 

$matchcount = preg_match_all('@#([^=]+)=([^/]*)/@', $string, $matches); 

for ($i = 0; $i < $matchcount; ++$i) { 
    echo "{$matches[1][$i]} = {$matches[2][$i]}\n"; 
} 

輸出:

A = 10
B = 25
VARNAME =你好世界

很久以前,我發現該網站http://www.regular-expressions.info/是有益的,它有很好的信息。您可能會發現用於測試正則表達式的GUI程序可能很有用,因爲它們可以在鍵入表達式時實時顯示匹配。想到一個例子是Regex Buddy,但這需要花錢。這個online regex tester看起來也很有希望。

+0

我需要在角色之間提取絕對的一切,是,它甚至可能是符號。該方法仍然有效嗎? – Ian

+0

是的,'([^ /] *)'表示保持匹配任何內容*除了'/',所以它將匹配任何字符,並繼續前進,直到它看到'/' – drew010

+0

爲了使它更強大,我改變了正則表達式的第一部分可以匹配任何字符,直到符號'=',所以現在'='之前的部分可以是任何東西。 – drew010

3
$string = "sometext/#a=10/#b=25/moretext"; 
$expr = '@#([a-z]+)=(.+?)/@'; 
$count = preg_match_all($expr, $string, $matches); 

$result = array(); 
for ($i = 0; $i < $count; $i++) { 
    $result[$matches[1][$i]] = $matches[2][$i]; 
} 

echo "<pre>"; 
print_r($result); 
echo "</pre>"; 

See it working

如果你真的想用正則表達式的螺母和螺栓交手,我可以推薦最好的資源是http://www.regular-expressions.info/

+0

謝謝,這是我可能最終使用的方法。我一定會查看該網站。 – Ian

相關問題