2014-10-03 32 views
1

我有一個文本,我想在該文本中獲得第一次出現2個或更多的字符串。正則表達式 - 第一次出現在所有組的字符串中

文字:

<prod##123456_test_12345##shirt> some more text <prod##123456_test_12345##shirt> 

正則表達式:

<prod##(\d*)_(.*?)##(.*?)##(.*?)> 

這將整個字符串匹配.. 但我想獲得 「<督促## 123456_test_12345 ##恤>」 而已。 (第一場比賽)。

我發現這一個:

(&lt;)(.*?\w+.*?)(&gt;) 

將第一個字符串匹配,但我想保持我的組解析以後。

我已經在這裏創造了一個試驗: http://regexr.com/v1?38pmq

我也試過Regular expression to stop at first match,但我不完全瞭解它是如何工作..

(它是PHP)

我真的想要解析此列表:

&lt;prod##12345678##Some text here&gt; 

&lt;prod##12345678##Some text here##Extra text&gt; 

&lt;prod##12345678##Some text here##Extra text&gt; 

&lt;prod##12345678_TEEXT##Some text here&gt; 

&lt;prod##12345678_TEEXT##Some text here##Extra text&gt; 

&lt;prod##12345678_TEEXT##Some text here##Extra text&gt; 

是否有可能創建一個正則表達式的組? 4種不同的也會很酷。

在PHP和輸出:

$product_reg = array ('/&lt;prod##(\d*)_(.*?)##(.*?)##(.*?)&gt;/', 
         '/&lt;prod##(\d*)_(.*?)##(.*?)&gt;/', 
         '/&lt;prod##(\d*)##(.*?)##(.*?)&gt;/', 
         '/&lt;prod##(\d*)##(.*?)&gt;/'); 
$product_rep = array ('<a href="domain.com/$1?test=$1&test2=$1_$2&$4">$3</a>', 
         '<a href="domain.com/$1?test=$1&test2=$1_$2">$3</a>', 
         '<a href="domain.com/$1?test=$3">$2</a>', 
         '<a href="domain.com/$1">$2</a>'); 
$string = preg_replace($product_reg, $product_rep, $string); 

回答

1

它看起來像你有一個額外的##對我來說(*?)。試試這個:

&lt;prod##(\d*)_(.*?)##(.*?)&gt; 

對於您的編輯字符串列表,你可以這樣做:

&lt;prod##(\d*)(_(.*?))?##(.*?)&gt; 

例如:

# Using the first string in your list: 

preg_match("/&lt;prod##(\d*)(_(.*?))?##(.*?)&gt;/", "&lt;prod##12345678##Some text here&gt;", $matches); 

var_dump($matches); 

# array(5) { 
# [0] => 
# string(38) "&lt;prod##12345678##Some text here&gt;" 
# [1] => 
# string(8) "12345678" 
# [2] => 
# string(0) "" 
# [3] => 
# string(0) "" 
# [4] => 
# string(14) "Some text here" 
# } 

和:

# Using the second string in your list: 

preg_match("/&lt;prod##(\d*)(_(.*?))?##(.*?)&gt;/", "&lt;prod##12345678_TEEXT##Some text here##Extra text&gt;", $matches); 

var_dump($matches); 

# array(5) { 
# [0] => 
# string(56) "&lt;prod##12345678_TEEXT##Some text here##Extra text&gt;" 
# [1] => 
# string(8) "12345678" 
# [2] => 
# string(6) "_TEEXT" 
# [3] => 
# string(5) "TEEXT" 
# [4] => 
# string(26) "Some text here##Extra text" 
# } 
+1

+1對於同一答案,與我的同一時間:-) – Toto 2014-10-03 11:40:37

+0

+1哈,同上!必須是正確的答案:) – 2014-10-03 11:46:59

+0

謝謝!我現在看到了!在我看到這個問題後,我的問題實際上有點複雜..將在一秒內更新我的問題。 – 2014-10-03 11:47:32

1

你的正則表達式中有一個多餘的組,請嘗試:

&lt;prod##(\d*)_(.*?)##(.*?)&gt; 
相關問題