2014-10-03 74 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; 
相关问题