2011-07-04 53 views
0

你能幫助我用正則表達式下面的例子:

lorem ipsum size large lorem ipsum 

lorem ipsum size m lorem ipsum 

lorem ipsum size 39.5 lorem ipsum 

所以在總之,我試圖提取一個單詞/字符串後的單詞/分隔符大小,直到下面的白色 空間。所以在上面的例子中,它將是(按順序):大,m,39.5。

任何想法?

快速更新: 請你還包括

size:$(size) 

可能
size: $(size) 

size $(size) 
+0

你需要提取它還是替換?使用['preg_replace()'](http://www.php.net/preg_replace)替換['preg_match()'](http://www.php.net/preg_match)或['preg_match_all() '](http://www.php.net/preg_match_all)進行提取。 – binaryLV

+0

我需要提取它,謝謝 – Marcin

回答

1
$strings = array(
    'lorem ipsum size large lorem ipsum', 
    'lorem ipsum size m lorem ipsum', 
    'lorem ipsum size 39.5 lorem ipsum ', 
); 
foreach ($strings as $string) { 
    if (preg_match('#\bsize\b\s+(\S+)\s#', $string, $matches)) { 
     echo "<b>Matched '{$string}':</b>\n\n"; 
     print_r($matches); 
    } 
} 

輸出:

Matched 'lorem ipsum size large lorem ipsum': 
Array 
(
    [0] => size large 
    [1] => large 
) 

Matched 'lorem ipsum size m lorem ipsum': 
Array 
(
    [0] => size m 
    [1] => m 
) 

Matched 'lorem ipsum size 39.5 lorem ipsum ': 
Array 
(
    [0] => size 39.5 
    [1] => 39.5 
) 

大小存儲在$matches[1]

+0

偉大的東西,但如果會有大小:? – Marcin

+1

像'size:large'?然後使用'#\ bsize \ b:?\ s +(\ S +)\ s#''作爲模式,它在'size'之後包含可選的':'。我還注意到最後'size'和'\ s'後面不需要'\ b',它可能就是'#\ bsize:?\ s +(\ S +)#''。 – binaryLV

+0

很酷,但也沒有工作的大小:大,必須跟着工作的空間 – Marcin

3
if (preg_match('/\bsize\W+(\S+)/', $subject, $regs)) { 
    $result = $regs[1]; 
} else { 
    $result = ""; 
} 

\bsize\W+匹配size加上一個或多個非字母數字字符(空格,標點符號等),但由於\b字邊界定位點不匹配capsize

然後(\S+)匹配一個或多個非空白字符並在第一個反向引用中捕獲它們(在這種情況下爲$regs[1])。

0
preg_match('/\ssize\s+(\S+)/', $string, $matches); 
echo $matches[1]; 
+1

我認爲這是行不通的。 PHP不允許在lookbehind斷言中無限重複。或者在新版本中更改過? –

+0

@Tim你是對的:) – Karolis