2014-01-17 175 views
0

我試圖讓正在執行正則表達式的字符串的一部分。 例如。正則表達式兩個字符之間的字符串php

$input = "This is a 'wonderful' day except i am 'stuck' here" 

我想獲得兩個'之間的所有字符。

爲了這個,我正在使用

preg_match('~\'(.*?)\'~', $input, $output); 

但我得到的結果只有wonderful$output[0]

什麼,我做錯了什麼?在這個例子中如何獲得第二部分,即stuck

編輯: 我檢查$ output [1]後問這個問題。 'stuck'不在那裏!

除了從我的程序中測試它,我還嘗試過一個在線正則表達式測試程序。這裏的結果:

http://s30.postimg.org/g6dj5xvmp/Selection_009.png

+0

Kind'a猜測這裏(從來沒有使用PHP的),但我認爲你的版本會工作,如果你只是在最後添加全局標誌「〜」,即'〜 \'(。*?)\'〜g'並刪除最後一個')',我猜這是一個錯字(或者它根本沒有用)。 (此外,逃避'是沒有必要的。) – ClasG

+0

嘿感謝指出')'是一個錯字.. – shivam

+0

@ClasG:單引號_have_在這裏逃脫,因爲OP的模式字符串由單引號分隔。 ..和PHP的PCRE的實現沒有全局標誌,但有一個'preg_match_all'函數可以做同樣的事情 –

回答

1

這是很簡單的。您正在使用preg_match,它試圖找到一個發生給定模式,找到所有匹配use preg_match_all
以同樣的方式這兩種工作:$matches陣列將具有分配到索引爲0(包括引號)全模式匹配,和基團(一個或多個)將被分配給所有後續索引(在這種情況下$matches[0]將包含引號內的字符)。區別在於preg_match_all將分配數組到上述索引,列出模式的每個匹配。

preg_match("/'([^]+)'/", $input, $matches); 
var_dump($matches); 

會給一個這樣的數組:

array(
    "'wonderful'", //because the pattern mentions the ' chars 
    "wonderful"  //because I'm grouping the chars inside the ' 
); 

鑑於此代碼:

preg_match_all("/'([^']+)'/", $input, $matches)); 

爲您提供:

array (
    //array of full matches, including the quotes 
    array (
     '\'wonderful\'', 
     '\'stuck\'', 
    ), 
    //array with groups 
    array (
     'wonderful', 
     'stuck', 
    ), 
); 

正如你可以看到on this live example

我簡化了一下你的表情,因爲你對「劃定的」感興趣,因此我匹配並組合每個非',後面跟着一個單引號,接下來是另一個單引號單引號。因此,你想要匹配的字符類只是[^'] ...除了'之外的任何字符。
您可以對此建議模式進行的後期微優化將使用與{1,}類似的possessive quantifier++。或者,如果您想匹配空字符串(如果找到''),則可以使用*+。所以

if (preg_match_all("/'([^']++)'/", $subject, $matches)) 
    var_dump($matches); 

應該做的伎倆

+0

我編輯了這個問題。請檢查 – shivam

+0

@singhshivam:是的......我解釋了爲什麼'preg_match'不匹配給定模式的所有出現,這就是爲什麼您應該使用'preg_match_all'。我還建議改變你的模式一點,因爲現在它'這''字符串'將離開你一個空的比賽 –

+0

謝謝埃利亞斯我知道了。你的回答應該是我第一次爲自己工作,但我犯了一個愚蠢的錯誤。無論如何,非常感謝你在這些細節中解釋我! :) – shivam

2

做這樣

<?php 
$str = "This is a 'wonderful' day except i am 'stuck' here"; 
preg_match_all("/'(.*?)'/", $str, $matches); 
print_r($matches[1]); 

OUTPUT:

Array 
(
    [0] => wonderful 
    [1] => stuck 
) 
+0

我編輯了這個問題。請檢查 – shivam

+0

@singhshivam,您期望的'輸出'是什麼?我沒有看到任何問題順便說一句。看到**演示** https://eval.in/91036 –

+1

它的奇怪,它在eval上的工作很好,即使我的完整代碼顯示正確的結果。但沒有在我的程序上工作。無論如何我現在確定問題在這裏。非常感謝你的幫助! :) – shivam

相關問題